]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_draw.c
added CVAR_SAVE and CVAR_NOTIFY flags to cvar_t structure (at the beginning), updated...
[xonotic/darkplaces.git] / gl_draw.c
index 69c8d7b83f727edd77a7d7f1b73bfada507f5e7c..8e0b3dc6025278c4c271c7a034e99b12589f1587 100644 (file)
--- a/gl_draw.c
+++ b/gl_draw.c
@@ -23,102 +23,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-#define GL_COLOR_INDEX8_EXT     0x80E5
+//#define GL_COLOR_INDEX8_EXT     0x80E5
 
-extern unsigned char d_15to8table[65536];
-
-cvar_t         qsg_version = {"qsg_version", "1"};
-cvar_t         gl_conalpha = {"gl_conalpha", "1"};
+cvar_t         scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"};
 
 byte           *draw_chars;                            // 8*8 graphic characters
 qpic_t         *draw_disc;
 
-//int                  translate_texture;
-int                    char_texture;
+rtexture_t     *char_texture;
 
 typedef struct
 {
-       int             texnum;
-       float   sl, tl, sh, th;
+       rtexture_t      *tex;
 } glpic_t;
 
-byte           conback_buffer[sizeof(qpic_t) + sizeof(glpic_t)];
-qpic_t         *conback = (qpic_t *)&conback_buffer;
-
-/*
-=============================================================================
-
-  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 */
@@ -139,8 +58,6 @@ byte         menuplyr_pixels[4096];
 int            pic_texels;
 int            pic_count;
 
-int GL_LoadPicTexture (qpic_t *pic);
-
 qpic_t *Draw_PicFromWad (char *name)
 {
        qpic_t  *p;
@@ -149,38 +66,7 @@ qpic_t *Draw_PicFromWad (char *name)
        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;
-       }
+       gl->tex = R_LoadTexture (name, p->width, p->height, p->data, TEXF_ALPHA | TEXF_PRECACHE);
        return p;
 }
 
@@ -209,7 +95,7 @@ qpic_t       *Draw_CachePic (char *path)
 //
 // load the pic from disk
 //
-       dat = (qpic_t *)COM_LoadTempFile (path, false);
+       dat = (qpic_t *)COM_LoadMallocFile (path, false);
        if (!dat)
                Sys_Error ("Draw_CachePic: failed to load %s", path);
        SwapPic (dat);
@@ -224,129 +110,73 @@ qpic_t   *Draw_CachePic (char *path)
        pic->pic.height = dat->height;
 
        gl = (glpic_t *)pic->pic.data;
-       gl->texnum = GL_LoadPicTexture (dat);
-       gl->sl = 0;
-       gl->sh = 1;
-       gl->tl = 0;
-       gl->th = 1;
-
-       return &pic->pic;
-}
-
-/*
-void Draw_CharToConback (int num, byte *dest)
-{
-       int             row, col;
-       byte    *source;
-       int             drawline;
-       int             x;
-
-       row = num>>4;
-       col = num&15;
-       source = draw_chars + (row<<10) + (col<<3);
-
-       drawline = 8;
+       gl->tex = loadtextureimage(path, 0, 0, false, false, true);
+       if (!gl->tex)
+               gl->tex = R_LoadTexture (path, dat->width, dat->height, dat->data, TEXF_ALPHA | TEXF_PRECACHE);
 
-       while (drawline--)
-       {
-               for (x=0 ; x<8 ; x++)
-                       if (source[x] != 255)
-                               dest[x] = 0x60 + source[x];
-               source += 128;
-               dest += 320;
-       }
+       qfree(dat);
 
+       return &pic->pic;
 }
-*/
-
-extern void LoadSky_f(void);
-
-extern char *QSG_EXTENSIONS;
 
 /*
 ===============
 Draw_Init
 ===============
 */
-void rmain_registercvars();
-extern int buildnumber;
-
-void gl_draw_start()
+void gl_draw_start(void)
 {
        int             i;
-       glpic_t *gl;
 
-       // load the console background and the charset
-       // by hand, because we need to write the version
-       // string into the background before turning
-       // it into a texture
-       char_texture = loadtextureimage ("conchars", 0, 0, false, false);
+       char_texture = loadtextureimage ("conchars", 0, 0, false, false, true);
        if (!char_texture)
        {
                draw_chars = W_GetLumpName ("conchars");
-               for (i=0 ; i<256*64 ; i++)
+               for (i=0 ; i<128*128 ; i++)
                        if (draw_chars[i] == 0)
                                draw_chars[i] = 255;    // proper transparent color
 
                // now turn them into textures
-               char_texture = GL_LoadTexture ("charset", 128, 128, draw_chars, false, true, 1);
+               char_texture = R_LoadTexture ("charset", 128, 128, draw_chars, TEXF_ALPHA | TEXF_PRECACHE);
        }
 
-       gl = (glpic_t *)conback->data;
-       gl->texnum = loadtextureimage("gfx/conback", 0, 0, false, false);
-       gl->sl = 0;
-       gl->sh = 1;
-       gl->tl = 0;
-       gl->th = 1;
-       conback->width = vid.width;
-       conback->height = vid.height;
-
-       memset(scraptexnum, 0, sizeof(scraptexnum));
+       conbacktex = loadtextureimage("gfx/conback", 0, 0, false, false, true);
 
        // get the other pics we need
        draw_disc = Draw_PicFromWad ("disc");
 }
 
-void gl_draw_shutdown()
+void gl_draw_shutdown(void)
+{
+}
+
+void gl_draw_newmap(void)
 {
 }
 
 char engineversion[40];
 int engineversionx, engineversiony;
 
-extern void GL_Textures_Init();
+extern void R_Textures_Init();
 void GL_Draw_Init (void)
 {
        int i;
-       Cvar_RegisterVariable (&qsg_version);
-       Cvar_RegisterVariable (&gl_conalpha);
-
-       Cmd_AddCommand ("loadsky", &LoadSky_f);
+       Cvar_RegisterVariable (&scr_conalpha);
 
-#ifdef NEHAHRA
-#if defined(__linux__)
-       sprintf (engineversion, "DPNehahra Linux   GL %.2f build %3i", (float) VERSION, buildnumber);
-#elif defined(WIN32)
-       sprintf (engineversion, "DPNehahra Windows GL %.2f build %3i", (float) VERSION, buildnumber);
-#else
-       sprintf (engineversion, "DPNehahra Unknown GL %.2f build %3i", (float) VERSION, buildnumber);
-#endif
-#else
 #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
 #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;
 
-       GL_Textures_Init();
-       R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown);
+       R_Textures_Init();
+       R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap);
 }
 
 /*
@@ -378,15 +208,25 @@ void Draw_Character (int x, int y, int num)
        fcol = col*0.0625;
        size = 0.0625;
 
-       glBindTexture(GL_TEXTURE_2D, char_texture);
+       if (!r_render.value)
+               return;
+       glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture));
        // LordHavoc: NEAREST mode on text if not scaling up
-       if ((int) vid.width < glwidth)
+       if (glwidth <= (int) vid.width)
        {
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        }
+       else
+       {
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       }
 
-       glColor3f(1,1,1);
+       if (lighthalf)
+               glColor3f(0.5f,0.5f,0.5f);
+       else
+               glColor3f(1.0f,1.0f,1.0f);
        glBegin (GL_QUADS);
        glTexCoord2f (fcol, frow);
        glVertex2f (x, y);
@@ -399,8 +239,11 @@ void Draw_Character (int x, int y, int num)
        glEnd ();
 
        // 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 (glwidth < (int) vid.width)
+//     {
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+//     }
 }
 
 /*
@@ -413,22 +256,32 @@ void Draw_String (int x, int y, char *str, int maxlen)
 {
        int num;
        float frow, fcol;
+       if (!r_render.value)
+               return;
        if (y <= -8 || y >= (int) vid.height || x >= (int) vid.width || *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 (glwidth <= (int) vid.width)
        {
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        }
+       else
+       {
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       }
 
-       glColor3f(1,1,1);
+       if (lighthalf)
+               glColor3f(0.5f,0.5f,0.5f);
+       else
+               glColor3f(1.0f,1.0f,1.0f);
        glBegin (GL_QUADS);
        while (maxlen-- && x < (int) vid.width) // stop rendering when out of characters or room
        {
@@ -436,46 +289,38 @@ void Draw_String (int x, int y, char *str, int maxlen)
                {
                        frow = (float) ((int) num >> 4)*0.0625;
                        fcol = (float) ((int) num & 15)*0.0625;
-                       glTexCoord2f (fcol, frow);
-                       glVertex2f (x, y);
-                       glTexCoord2f (fcol + 0.0625, frow);
-                       glVertex2f (x+8, y);
-                       glTexCoord2f (fcol + 0.0625, frow + 0.0625);
-                       glVertex2f (x+8, y+8);
-                       glTexCoord2f (fcol, frow + 0.0625);
-                       glVertex2f (x, y+8);
+                       glTexCoord2f (fcol         , frow         );glVertex2f (x, y);
+                       glTexCoord2f (fcol + 0.0625, frow         );glVertex2f (x+8, y);
+                       glTexCoord2f (fcol + 0.0625, frow + 0.0625);glVertex2f (x+8, y+8);
+                       glTexCoord2f (fcol         , frow + 0.0625);glVertex2f (x, y+8);
                }
                x += 8;
        }
        glEnd ();
 
        // 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 (glwidth < (int) vid.width)
+//     {
+//             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, float x, float y, float width, float height)
+void Draw_GenericPic (rtexture_t *tex, float red, float green, float blue, float alpha, int x, int y, int width, int height)
 {
-       glDisable(GL_ALPHA_TEST);
-//     glEnable (GL_BLEND);
-       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-//     glCullFace(GL_FRONT);
-       glColor4f(red,green,blue,alpha);
-       glBindTexture(GL_TEXTURE_2D, texnum);
-       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       if (!r_render.value)
+               return;
+       if (lighthalf)
+               glColor4f(red * 0.5f, green * 0.5f, blue * 0.5f, alpha);
+       else
+               glColor4f(red, green, blue, alpha);
+       glBindTexture(GL_TEXTURE_2D, R_GetTexture(tex));
        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);
+       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 ();
-       glColor3f(1,1,1);
-//     glEnable(GL_ALPHA_TEST);
-//     glDisable (GL_BLEND);
 }
 
 /*
@@ -485,31 +330,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;
-//     glDisable(GL_ALPHA_TEST);
-//     glEnable (GL_BLEND);
-//     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-//     glCullFace(GL_FRONT);
-       glColor4f(0.8,0.8,0.8,alpha);
-       glBindTexture(GL_TEXTURE_2D, gl->texnum);
-//     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-       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 ();
-       glColor3f(1,1,1);
-//     glEnable(GL_ALPHA_TEST);
-//     glDisable (GL_BLEND);
+       if (pic)
+               Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,alpha, x,y,pic->width, pic->height);
 }
 
 
@@ -520,87 +342,50 @@ Draw_Pic
 */
 void Draw_Pic (int x, int y, qpic_t *pic)
 {
-       glpic_t                 *gl;
-
-       if (scrap_dirty)
-               Scrap_Upload ();
-       gl = (glpic_t *)pic->data;
-       glColor3f(0.8,0.8,0.8);
-       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,1, x,y,pic->width, pic->height);
 }
 
 
-/*
-=============
-Draw_TransPic
-=============
-*/
-void Draw_TransPic (int x, int y, qpic_t *pic)
+void Draw_AdditivePic (int x, int y, qpic_t *pic)
 {
-       if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 || (unsigned)(y + pic->height) > vid.height)
-               Sys_Error ("Draw_TransPic: bad coordinates");
-
-//     glEnable(GL_BLEND);
-//     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-//     glDisable(GL_ALPHA_TEST);
-       Draw_Pic (x, y, pic);
-//     glDisable(GL_BLEND);
+       if (pic)
+       {
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+               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);
+       }
 }
 
 
 /*
 =============
-Draw_TransPicTranslate
+Draw_PicTranslate
 
 Only used for the player color selection menu
 =============
 */
-void Draw_TransPicTranslate (int x, int y, qpic_t *pic, byte *translation)
+void Draw_PicTranslate (int x, int y, qpic_t *pic, byte *translation)
 {
-       int                             v, u, c;
-       unsigned                trans[64*64], *dest;
-       byte                    *src;
-       int                             p;
+       int                             i, c;
+       byte                    *trans, *src, *dest;
+       rtexture_t              *rt;
 
-       c = pic->width * pic->height;
+       if (pic == NULL)
+               return;
 
-       dest = trans;
-       for (v=0 ; v<64 ; v++, dest += 64)
-       {
-               src = &menuplyr_pixels[ ((v*pic->height)>>6) *pic->width];
-               for (u=0 ; u<64 ; u++)
-               {
-                       p = src[(u*pic->width)>>6];
-                       if (p == 255)
-                               dest[u] = p;
-                       else
-                               dest[u] =  d_8to24table[translation[p]];
-               }
-       }
+       c = pic->width * pic->height;
+       src = menuplyr_pixels;
+       dest = trans = qmalloc(c);
+       for (i = 0;i < c;i++)
+               *dest++ = translation[*src++];
 
-       glBindTexture(GL_TEXTURE_2D, GL_LoadTexture ("translatedplayerpic", 64, 64, (void *) trans, false, true, 1));
+       rt = R_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, TEXF_ALPHA | TEXF_PRECACHE);
+       qfree(trans);
 
-       glColor3f(0.8,0.8,0.8);
-       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 ();
+       if (!r_render.value)
+               return;
+       Draw_GenericPic (rt, 1,1,1,1, x, y, pic->width, pic->height);
 }
 
 
@@ -612,14 +397,7 @@ Draw_ConsoleBackground
 */
 void Draw_ConsoleBackground (int lines)
 {
-       // LordHavoc: changed alpha
-       //int y = (vid.height >> 1);
-
-       if (lines >= (int) vid.height)
-               Draw_Pic(0, lines - vid.height, conback);
-       else
-               Draw_AlphaPic (0, lines - vid.height, conback, gl_conalpha.value*lines/vid.height);
-       //      Draw_AlphaPic (0, lines - vid.height, conback, (float)(1.2 * lines)/y);
+       Draw_GenericPic (conbacktex, 1,1,1,scr_conalpha.value*lines/vid.height, 0, lines - vid.height, vid.width, vid.height);
        // LordHavoc: draw version
        Draw_String(engineversionx, lines - vid.height + engineversiony, engineversion, 9999);
 }
@@ -633,8 +411,16 @@ 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)
+               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);
+       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]);
 
        glBegin (GL_QUADS);
 
@@ -660,6 +446,8 @@ Setup as if the screen was 320*200
 */
 void GL_Set2D (void)
 {
+       if (!r_render.value)
+               return;
        glViewport (glx, gly, glwidth, glheight);
 
        glMatrixMode(GL_PROJECTION);
@@ -671,8 +459,7 @@ void GL_Set2D (void)
 
        glDisable (GL_DEPTH_TEST);
        glDisable (GL_CULL_FACE);
-       glEnable (GL_BLEND); // was Disable
-//     glEnable (GL_ALPHA_TEST);
+       glEnable (GL_BLEND);
        glDisable (GL_ALPHA_TEST);
        glEnable(GL_TEXTURE_2D);
 
@@ -696,7 +483,7 @@ typedef struct showlmp_s
 
 showlmp_t showlmp[SHOWLMP_MAXLABELS];
 
-void SHOWLMP_decodehide()
+void SHOWLMP_decodehide(void)
 {
        int i;
        byte *lmplabel;
@@ -709,15 +496,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 (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)
@@ -740,15 +535,15 @@ void SHOWLMP_decodeshow()
        showlmp[k].y = y;
 }
 
-void SHOWLMP_drawall()
+void SHOWLMP_drawall(void)
 {
        int i;
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)
                if (showlmp[i].isactive)
-                       Draw_TransPic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic));
+                       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++)