]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
replaced sbarpic_t with cachepic_t in sbar code (saves a bit of memory)
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 4 Mar 2006 09:24:21 +0000 (09:24 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 4 Mar 2006 09:24:21 +0000 (09:24 +0000)
changed DrawQ_SuperPic and DrawQ_Pic to take a cachepic_t * instead of a pic name (this speeds up the sbar code by not using name lookups constantly)
removed DrawQ_Fill (use DrawQ_Pic with NULL pic instead)
changed crosshair/editlights cursors to use r_crosshairs array initialized at startup instead of constantly calling Draw_CachePic
changed Host_Init to call SCR_BeginLoadingPlaque instead of Host_StartVideo (which is called by SCR_BeginLoadingPlaque)

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6058 d7cf8633-e32d-0410-b094-e92efae38249

12 files changed:
cl_screen.c
cl_screen.h
cl_video.c
client.h
console.c
gl_draw.c
host.c
menu.c
prvm_cmds.c
r_crosshairs.c
r_shadow.c
sbar.c

index 75a8a262a76c51823bc77f9b3e016f97e587699b..714d9feb12c8decc30c1134393387df5b8d6a1cb 100644 (file)
@@ -293,7 +293,7 @@ void SCR_DrawTurtle (void)
        if (count < 3)
                return;
 
-       DrawQ_Pic (0, 0, "gfx/turtle", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (0, 0, Draw_CachePic("gfx/turtle", false), 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -310,7 +310,7 @@ void SCR_DrawNet (void)
        if (cls.demoplayback)
                return;
 
-       DrawQ_Pic (64, 0, "gfx/net", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (64, 0, Draw_CachePic("gfx/net", false), 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -332,7 +332,7 @@ void SCR_DrawPause (void)
                return;
 
        pic = Draw_CachePic ("gfx/pause", true);
-       DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, (vid_conheight.integer - pic->height)/2, "gfx/pause", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, (vid_conheight.integer - pic->height)/2, pic, 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -388,7 +388,7 @@ void SCR_DrawBrand (void)
                return;
        }
 
-       DrawQ_Pic (x, y, "gfx/brand", 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (x, y, pic, 0, 0, 1, 1, 1, 1, 0);
 }
 
 /*
@@ -408,7 +408,7 @@ static void SCR_DrawDownload(void)
        len = (int)strlen(temp);
        x = (vid_conwidth.integer - len*size) / 2;
        y = vid_conheight.integer - size;
-       DrawQ_Fill(0, y, vid_conwidth.integer, size, 0, 0, 0, 0.5, 0);
+       DrawQ_Pic(0, y, NULL, vid_conwidth.integer, size, 0, 0, 0, 0.5, 0);
        DrawQ_String(x, y, temp, len, size, size, 1, 1, 1, 1, 0);
 }
 
@@ -557,7 +557,7 @@ void R_TimeReport_Frame(void)
                                        lines++;
                        y = vid_conheight.integer - sb_lines - lines * 8;
                        i = j = 0;
-                       DrawQ_Fill(0, y, vid_conwidth.integer, lines * 8, 0, 0, 0, 0.5, 0);
+                       DrawQ_Pic(0, y, NULL, vid_conwidth.integer, lines * 8, 0, 0, 0, 0.5, 0);
                        while (r_speeds_string[i])
                        {
                                j = i;
@@ -661,9 +661,9 @@ void DrawQ_Clear(void)
 }
 
 static int picelements[6] = {0, 1, 2, 0, 2, 3};
-void DrawQ_Pic(float x, float y, const char *picname, float width, float height, float red, float green, float blue, float alpha, int flags)
+void DrawQ_Pic(float x, float y, cachepic_t *pic, float width, float height, float red, float green, float blue, float alpha, int flags)
 {
-       DrawQ_SuperPic(x,y,picname,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
+       DrawQ_SuperPic(x,y,pic,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
 }
 
 void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
@@ -713,22 +713,13 @@ void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex
        DrawQ_String_Real(x,y,string,maxlen,scalex,scaley,red,green,blue,alpha,flags);
 }
 
-
-
-void DrawQ_Fill (float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags)
-{
-       DrawQ_SuperPic(x,y,NULL,w,h,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
-}
-
-void DrawQ_SuperPic(float x, float y, const char *picname, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags)
+void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags)
 {
        float floats[36];
-       cachepic_t *pic;
        drawqueuemesh_t mesh;
        memset(&mesh, 0, sizeof(mesh));
-       if (picname && picname[0])
+       if (pic)
        {
-               pic = Draw_CachePic(picname, false);
                if (width == 0)
                        width = pic->width;
                if (height == 0)
@@ -1440,7 +1431,7 @@ void SHOWLMP_drawall(void)
        int i;
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)
                if (showlmp[i].isactive)
-                       DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
+                       DrawQ_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic, false), 0, 0, 1, 1, 1, 1, 0);
 }
 
 void SHOWLMP_clear(void)
index b1663a15e98dfe19d328493c06e9fef0596adc20..823003cfd97da9e67371b0edb5d9014b71aa9871 100644 (file)
@@ -50,16 +50,14 @@ DRAWFLAG_NUMFLAGS
 
 // clear the draw queue
 void DrawQ_Clear(void);
-// draw an image
-void DrawQ_Pic(float x, float y, const char *picname, float width, float height, float red, float green, float blue, float alpha, int flags);
+// draw an image (or a filled rectangle if pic == NULL)
+void DrawQ_Pic(float x, float y, cachepic_t *pic, float width, float height, float red, float green, float blue, float alpha, int flags);
 // draw a text string
 void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags);
 // draw a text string that supports color tags (colorindex can either be NULL, -1 to make it choose the default color or valid index to start with)
 void DrawQ_ColoredString( float x, float y, const char *text, int maxlen, float scalex, float scaley, float basered, float basegreen, float baseblue, float basealpha, int flags, int *outcolor );
-// draw a filled rectangle
-void DrawQ_Fill(float x, float y, float w, float h, float red, float green, float blue, float alpha, int flags);
 // draw a very fancy pic (per corner texcoord/color control), the order is tl, tr, bl, br
-void DrawQ_SuperPic(float x, float y, const char *picname, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags);
+void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height, float s1, float t1, float r1, float g1, float b1, float a1, float s2, float t2, float r2, float g2, float b2, float a2, float s3, float t3, float r3, float g3, float b3, float a3, float s4, float t4, float r4, float g4, float b4, float a4, int flags);
 // draw a triangle mesh
 void DrawQ_Mesh(drawqueuemesh_t *mesh, int flags);
 // set the clipping area
index a6f067de13e59e3310badf08e583a872c2b0f3db..e74f27094cc27c685c2b0362c270ce8f65490e19 100644 (file)
@@ -246,7 +246,7 @@ int cl_videoplaying = false; // old, but still supported
 void CL_DrawVideo(void)
 {
        if (cl_videoplaying)
-               DrawQ_Pic(0, 0, videoarray->cpif.name, vid_conwidth.integer, vid_conheight.integer, 1, 1, 1, 1, 0);
+               DrawQ_Pic(0, 0, &videoarray->cpif, vid_conwidth.integer, vid_conheight.integer, 1, 1, 1, 1, 0);
 }
 
 void CL_VideoStart(char *filename)
index b004d8b54fc5f922c4320be2e791c0c175ca8fd0..cb36d4d4aa3564a817b7f15e40a70df4e874f676 100644 (file)
--- a/client.h
+++ b/client.h
@@ -1015,6 +1015,9 @@ void R_NewExplosion(vec3_t org);
 
 #include "cl_screen.h"
 
+#define NUMCROSSHAIRS 6
+extern cachepic_t *r_crosshairs[NUMCROSSHAIRS];
+
 typedef struct refdef_s
 {
        // area to render in
index cd11547ddbbb5e7554b8ff45d6a230f7a81157ba..5c798f56f2c77a882260abd38d7bff8ced006c58 100644 (file)
--- a/console.c
+++ b/console.c
@@ -840,10 +840,7 @@ void Con_DrawConsole (int lines)
                return;
 
 // draw the background
-       if (scr_conbrightness.value >= 0.01f)
-               DrawQ_Pic(0, lines - vid_conheight.integer, "gfx/conback", vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0);
-       else
-               DrawQ_Fill(0, lines - vid_conheight.integer, vid_conwidth.integer, vid_conheight.integer, 0, 0, 0, scr_conalpha.value, 0);
+       DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback", false) : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0);
        DrawQ_String(vid_conwidth.integer - strlen(engineversion) * con_textsize.value - con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0);
 
 // draw the text
index 40146424c1f108b4f39179df95ffd156ab09e3cd..aecd32133b6ce9febb6fb1e23b68b7f110a86430 100644 (file)
--- a/gl_draw.c
+++ b/gl_draw.c
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 
 static rtexture_t *char_texture;
+cachepic_t *r_crosshairs[NUMCROSSHAIRS];
 
 //=============================================================================
 /* Support Routines */
@@ -139,9 +140,6 @@ static rtexture_t *draw_generatemousepointer(void)
        return R_LoadTexture2D(drawtexturepool, "mousepointer", 16, 16, &buffer[0][0], TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL);
 }
 
-// must match NUMCROSSHAIRS in r_crosshairs.c
-#define NUMCROSSHAIRS 6
-
 static char *crosshairtexdata[NUMCROSSHAIRS] =
 {
        "................"
@@ -309,7 +307,6 @@ cachepic_t  *Draw_CachePic (const char *path, qboolean persistent)
        int flags;
 
        if (!strncmp(CLVIDEOPREFIX, path, sizeof(CLVIDEOPREFIX) - 1))
-
        {
                clvideo_t *video;
 
@@ -464,12 +461,15 @@ Draw_Init
 */
 static void gl_draw_start(void)
 {
+       int i;
        drawtexturepool = R_AllocTexturePool();
 
        numcachepics = 0;
        memset(cachepichash, 0, sizeof(cachepichash));
 
        char_texture = Draw_CachePic("gfx/conchars", true)->tex;
+       for (i = 0;i < NUMCROSSHAIRS;i++)
+               r_crosshairs[i] = Draw_CachePic(va("gfx/crosshair%i", i), false);
 }
 
 static void gl_draw_shutdown(void)
diff --git a/host.c b/host.c
index bd4760e6a91837f3ca9d735f93774d9106fac154..3cf4f493900412ecf165a4a1148e323a43bea777 100644 (file)
--- a/host.c
+++ b/host.c
@@ -1033,9 +1033,11 @@ void Host_Init (void)
        // save console log up to this point to log_file if it was set by configs
        Log_Start();
 
+       // put up the loading image so the user doesn't stare at a black screen...
+       SCR_BeginLoadingPlaque();
+
        // FIXME: put this into some neat design, but the menu should be allowed to crash
        // without crashing the whole game, so this should just be a short-time solution
-       Host_StartVideo();
 
        // here comes the not so critical stuff
        if (setjmp(host_abortframe)) {
@@ -1095,7 +1097,7 @@ void Host_Init (void)
 
        Con_DPrint("========Initialized=========\n");
 
-       Host_StartVideo();
+       //Host_StartVideo();
 }
 
 
diff --git a/menu.c b/menu.c
index 587644dba708831ccd7a71a9d4a70b5f1b75eaf0..0297d8fa4e54a549f6ffb9d5c2e3101a988f40f9 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -167,8 +167,8 @@ void M_Background(int width, int height)
        menu_height = bound(1, height, vid_conheight.integer);
        menu_x = (vid_conwidth.integer - menu_width) * 0.5;
        menu_y = (vid_conheight.integer - menu_height) * 0.5;
-       //DrawQ_Fill(menu_x, menu_y, menu_width, menu_height, 0, 0, 0, 0.5, 0);
-       DrawQ_Fill(0, 0, vid_conwidth.integer, vid_conheight.integer, 0, 0, 0, 0.5, 0);
+       //DrawQ_Pic(menu_x, menu_y, NULL, menu_width, menu_height, 0, 0, 0, 0.5, 0);
+       DrawQ_Pic(0, 0, NULL, vid_conwidth.integer, vid_conheight.integer, 0, 0, 0, 0.5, 0);
 }
 
 /*
@@ -211,7 +211,7 @@ void M_ItemPrint(float cx, float cy, const char *str, int unghosted)
 
 void M_DrawPic (float cx, float cy, const char *picname)
 {
-       DrawQ_Pic (menu_x + cx, menu_y + cy, picname, 0, 0, 1, 1, 1, 1, 0);
+       DrawQ_Pic (menu_x + cx, menu_y + cy, Draw_CachePic(picname, false), 0, 0, 1, 1, 1, 1, 0);
 }
 
 unsigned char identityTable[256];
@@ -1640,7 +1640,7 @@ void M_Options_PrintCommand(const char *s, int enabled)
 {
        if (opty >= 32)
        {
-               DrawQ_Fill(menu_x, menu_y + opty, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
+               DrawQ_Pic(menu_x, menu_y + opty, NULL, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
                M_ItemPrint(0, opty, s, enabled);
        }
        opty += 8;
@@ -1651,7 +1651,7 @@ void M_Options_PrintCheckbox(const char *s, int enabled, int yes)
 {
        if (opty >= 32)
        {
-               DrawQ_Fill(menu_x, menu_y + opty, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
+               DrawQ_Pic(menu_x, menu_y + opty, NULL, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
                M_ItemPrint(0, opty, s, enabled);
                M_DrawCheckbox(0 + (int)strlen(s) * 8 + 8, opty, yes);
        }
@@ -1663,7 +1663,7 @@ void M_Options_PrintSlider(const char *s, int enabled, float value, float minval
 {
        if (opty >= 32)
        {
-               DrawQ_Fill(menu_x, menu_y + opty, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
+               DrawQ_Pic(menu_x, menu_y + opty, NULL, 320, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
                M_ItemPrint(0, opty, s, enabled);
                M_DrawSlider(0 + (int)strlen(s) * 8 + 8, opty, value, minvalue, maxvalue);
        }
@@ -2194,7 +2194,9 @@ void M_Options_ColorControl_Draw (void)
 {
        int visible;
        float x, c, s, t, u, v;
-       cachepic_t      *p;
+       cachepic_t      *p, *dither;
+
+       dither = Draw_CachePic("gfx/colorcontrol/ditherpattern", false);
 
        M_Background(320, 256);
 
@@ -2227,17 +2229,17 @@ void M_Options_ColorControl_Draw (void)
        M_Options_PrintSlider(  "          White: Grey ", v_color_enable.integer, (v_color_white_r.value + v_color_white_g.value + v_color_white_b.value) / 3, 1, 5);
 
        opty += 4;
-       DrawQ_Fill(menu_x, menu_y + opty, 320, 4 + 64 + 8 + 64 + 4, 0, 0, 0, 1, 0);opty += 4;
+       DrawQ_Pic(menu_x, menu_y + opty, NULL, 320, 4 + 64 + 8 + 64 + 4, 0, 0, 0, 1, 0);opty += 4;
        s = (float) 312 / 2 * vid.width / vid_conwidth.integer;
        t = (float) 4 / 2 * vid.height / vid_conheight.integer;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern", 312, 4, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL                                , 312, 4, 0,0, 0,0,0,1, 1,0, 1,0,0,1, 0,1, 0,0,0,1, 1,1, 1,0,0,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern", 312, 4, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL                                , 312, 4, 0,0, 0,0,0,1, 1,0, 0,1,0,1, 0,1, 0,0,0,1, 1,1, 0,1,0,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern", 312, 4, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL                                , 312, 4, 0,0, 0,0,0,1, 1,0, 0,0,1,1, 0,1, 0,0,0,1, 1,1, 0,0,1,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern", 312, 4, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);opty += 4;
-       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL                                , 312, 4, 0,0, 0,0,0,1, 1,0, 1,1,1,1, 0,1, 0,0,0,1, 1,1, 1,1,1,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, dither, 312, 4, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL  , 312, 4, 0,0, 0,0,0,1, 1,0, 1,0,0,1, 0,1, 0,0,0,1, 1,1, 1,0,0,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, dither, 312, 4, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL  , 312, 4, 0,0, 0,0,0,1, 1,0, 0,1,0,1, 0,1, 0,0,0,1, 1,1, 0,1,0,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, dither, 312, 4, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL  , 312, 4, 0,0, 0,0,0,1, 1,0, 0,0,1,1, 0,1, 0,0,0,1, 1,1, 0,0,1,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, dither, 312, 4, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);opty += 4;
+       DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL  , 312, 4, 0,0, 0,0,0,1, 1,0, 1,1,1,1, 0,1, 0,0,0,1, 1,1, 1,1,1,1, 0);opty += 4;
 
        c = menu_options_colorcontrol_correctionvalue.value; // intensity value that should be matched up to a 50% dither to 'correct' quake
        s = (float) 48 / 2 * vid.width / vid_conwidth.integer;
@@ -2246,21 +2248,21 @@ void M_Options_ColorControl_Draw (void)
        v = t * 0.5;
        opty += 8;
        x = 4;
-       DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, c, 0, 0, 1, 0);
-       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);
-       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 1,0,0,1, u,0, 1,0,0,1, 0,v, 1,0,0,1, u,v, 1,0,0,1, 0);
+       DrawQ_Pic(menu_x + x, menu_y + opty, NULL, 64, 48, c, 0, 0, 1, 0);
+       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, dither, 16, 16, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);
+       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, dither, 16, 16, 0,0, 1,0,0,1, u,0, 1,0,0,1, 0,v, 1,0,0,1, u,v, 1,0,0,1, 0);
        x += 80;
-       DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, 0, c, 0, 1, 0);
-       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);
-       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 0,1,0,1, u,0, 0,1,0,1, 0,v, 0,1,0,1, u,v, 0,1,0,1, 0);
+       DrawQ_Pic(menu_x + x, menu_y + opty, NULL, 64, 48, 0, c, 0, 1, 0);
+       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, dither, 16, 16, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);
+       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, dither, 16, 16, 0,0, 0,1,0,1, u,0, 0,1,0,1, 0,v, 0,1,0,1, u,v, 0,1,0,1, 0);
        x += 80;
-       DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, 0, 0, c, 1, 0);
-       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);
-       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 0,0,1,1, u,0, 0,0,1,1, 0,v, 0,0,1,1, u,v, 0,0,1,1, 0);
+       DrawQ_Pic(menu_x + x, menu_y + opty, NULL, 64, 48, 0, 0, c, 1, 0);
+       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, dither, 16, 16, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);
+       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, dither, 16, 16, 0,0, 0,0,1,1, u,0, 0,0,1,1, 0,v, 0,0,1,1, u,v, 0,0,1,1, 0);
        x += 80;
-       DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, c, c, c, 1, 0);
-       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);
-       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern", 16, 16, 0,0, 1,1,1,1, u,0, 1,1,1,1, 0,v, 1,1,1,1, u,v, 1,1,1,1, 0);
+       DrawQ_Pic(menu_x + x, menu_y + opty, NULL, 64, 48, c, c, c, 1, 0);
+       DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, dither, 16, 16, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);
+       DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, dither, 16, 16, 0,0, 1,1,1,1, u,0, 1,1,1,1, 0,v, 1,1,1,1, u,v, 1,1,1,1, 0);
 }
 
 
@@ -3075,10 +3077,10 @@ void M_Menu_Credits_f (void)
 void M_Credits_Draw (void)
 {
        M_Background(640, 480);
-       DrawQ_Pic (0, 0, "gfx/creditsmiddle", 0, 0, 1, 1, 1, 1, 0);
+       M_DrawPic (0, 0, "gfx/creditsmiddle");
        M_Print (640/2 - 14/2*8, 236, "Coming soon...");
-       DrawQ_Pic (0, 0, "gfx/creditstop", 0, 0, 1, 1, 1, 1, 0);
-       DrawQ_Pic (0, 433, "gfx/creditsbottom", 0, 0, 1, 1, 1, 1, 0);
+       M_DrawPic (0, 0, "gfx/creditstop");
+       M_DrawPic (0, 433, "gfx/creditsbottom");
 }
 
 
@@ -4331,7 +4333,7 @@ void M_ServerList_Draw (void)
        {
                for (n = start;n < end;n++)
                {
-                       DrawQ_Fill(menu_x, menu_y + y, 640, 16, n == slist_cursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
+                       DrawQ_Pic(menu_x, menu_y + y, NULL, 640, 16, n == slist_cursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0);
                        M_PrintColored(0, y, serverlist_viewlist[n]->line1);y += 8;
                        M_PrintColored(0, y, serverlist_viewlist[n]->line2);y += 8;
                }
@@ -4581,7 +4583,7 @@ void M_Draw (void)
 
        if (gamemode == GAME_TRANSFUSION) {
                if (m_state != m_credits) {
-                       cachepic_t      *p;
+                       cachepic_t      *p, *drop1, *drop2, *drop3;
                        int g, scale_x, scale_y, scale_y_repeat, top_offset;
                        float scale_y_rate;
                        scale_y_repeat = vid_conheight.integer * 2;
@@ -4589,21 +4591,24 @@ void M_Draw (void)
                        scale_y_rate = (float)(g+1) / 96;
                        top_offset = (g+12)/12;
                        p = Draw_CachePic (va("gfx/menu/blooddrip%i", top_offset), false);
+                       drop1 = Draw_CachePic("gfx/menu/blooddrop1", false);
+                       drop2 = Draw_CachePic("gfx/menu/blooddrop2", false);
+                       drop3 = Draw_CachePic("gfx/menu/blooddrop3", false);
                        for (scale_x = 0; scale_x <= vid_conwidth.integer; scale_x += p->width) {
                                for (scale_y = -scale_y_repeat; scale_y <= vid_conheight.integer; scale_y += scale_y_repeat) {
-                                       DrawQ_Pic (scale_x + 21, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x +  116, scale_y_repeat + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop1", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 180, scale_y_repeat * .275 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 242, scale_y_repeat * .75 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 304, scale_y_repeat * .25 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 362, scale_y_repeat * .46125 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 402, scale_y_repeat * .1725 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 438, scale_y_repeat * .9 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop1", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 484, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop3", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 557, scale_y_repeat * .9425 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop1", 0, 0, 1, 1, 1, 1, 0);
-                                       DrawQ_Pic (scale_x + 606, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, "gfx/menu/blooddrop2", 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 21, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x +  116, scale_y_repeat + scale_y + scale_y_rate * scale_y_repeat, drop1, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 180, scale_y_repeat * .275 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 242, scale_y_repeat * .75 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 304, scale_y_repeat * .25 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 362, scale_y_repeat * .46125 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 402, scale_y_repeat * .1725 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 438, scale_y_repeat * .9 + scale_y + scale_y_rate * scale_y_repeat, drop1, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 484, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 557, scale_y_repeat * .9425 + scale_y + scale_y_rate * scale_y_repeat, drop1, 0, 0, 1, 1, 1, 1, 0);
+                                       DrawQ_Pic (scale_x + 606, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, drop2, 0, 0, 1, 1, 1, 1, 0);
                                }
-                               DrawQ_Pic (scale_x, -1, va("gfx/menu/blooddrip%i", top_offset), 0, 0, 1, 1, 1, 1, 0);
+                               DrawQ_Pic (scale_x, -1, Draw_CachePic(va("gfx/menu/blooddrip%i", top_offset), false), 0, 0, 1, 1, 1, 1, 0);
                        }
                }
        }
index 19925a9776c29a051498d50e842dc70a404344d3..e555ad1703f7a74fba301fa72ec4e4167cab4b09 100644 (file)
@@ -2482,27 +2482,27 @@ float   drawpic(vector position, string pic, vector size, vector rgb, float alpha,
 */
 void VM_drawpic(void)
 {
-       const char *pic;
+       const char *picname;
        float *size, *pos, *rgb;
        int flag;
 
        VM_SAFEPARMCOUNT(6,VM_drawpic);
 
-       pic = PRVM_G_STRING(OFS_PARM1);
+       picname = PRVM_G_STRING(OFS_PARM1);
 
-       if(!pic)
+       if(!picname)
        {
                Con_Printf("VM_drawpic: %s passed null picture name !\n", PRVM_NAME);
                PRVM_G_FLOAT(OFS_RETURN) = -1;
                return;
        }
 
-       VM_CheckEmptyString (pic);
+       VM_CheckEmptyString (picname);
 
        // is pic cached ? no function yet for that
        if(!1)
        {
-               Con_Printf("VM_drawpic: %s: %s not cached !\n", PRVM_NAME, pic);
+               Con_Printf("VM_drawpic: %s: %s not cached !\n", PRVM_NAME, picname);
                PRVM_G_FLOAT(OFS_RETURN) = -4;
                return;
        }
@@ -2522,7 +2522,7 @@ void VM_drawpic(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_Pic(pos[0], pos[1], pic, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
+       DrawQ_Pic(pos[0], pos[1], Draw_CachePic(picname, false), size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 
@@ -2556,7 +2556,7 @@ void VM_drawfill(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_Pic(pos[0], pos[1], 0, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM3), flag);
+       DrawQ_Pic(pos[0], pos[1], NULL, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM3), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 
index 4ec42f3b8366942734d0745faa90947f82ee7e53..dcef703ff43a8212a29afc565f8a32282f4509ff 100644 (file)
@@ -9,9 +9,6 @@ cvar_t crosshair_flashrange = {CVAR_SAVE, "crosshair_flashrange", "0.1", "how mu
 cvar_t crosshair_size = {CVAR_SAVE, "crosshair_size", "1", "adjusts size of the crosshair on the screen"};
 cvar_t crosshair_static = {CVAR_SAVE, "crosshair_static", "1", "if 1 the crosshair is a 2D overlay, if 0 it is a sprite in the world indicating where your weapon will hit in standard quake mods (if the mod has the weapon somewhere else this won't be accurate)"};
 
-// must match NUMCROSSHAIRS in gl_draw.c
-#define NUMCROSSHAIRS 6
-
 void R_Crosshairs_Init(void)
 {
        Cvar_RegisterVariable(&crosshair_brightness);
@@ -72,7 +69,7 @@ void R_DrawWorldCrosshair(void)
                return;
        if (!cl.viewentity || !cl_entities[cl.viewentity].state_current.active)
                return;
-       pic = Draw_CachePic(va("gfx/crosshair%i", num), true);
+       pic = r_crosshairs[num];
        if (!pic)
                return;
        R_GetCrosshairColor(color);
@@ -107,11 +104,11 @@ void R_Draw2DCrosshair(void)
                return;
        if (!cl.viewentity || !cl_entities[cl.viewentity].state_current.active)
                return;
-       pic = Draw_CachePic(va("gfx/crosshair%i", num), true);
+       pic = r_crosshairs[num];
        if (pic)
        {
                R_GetCrosshairColor(color);
-               DrawQ_Pic((vid_conwidth.integer - pic->width * crosshair_size.value) * 0.5f, (vid_conheight.integer - pic->height * crosshair_size.value) * 0.5f, pic->name, pic->width * crosshair_size.value, pic->height * crosshair_size.value, color[0], color[1], color[2], color[3], 0);
+               DrawQ_Pic((vid_conwidth.integer - pic->width * crosshair_size.value) * 0.5f, (vid_conheight.integer - pic->height * crosshair_size.value) * 0.5f, pic, pic->width * crosshair_size.value, pic->height * crosshair_size.value, color[0], color[1], color[2], color[3], 0);
        }
 }
 
index 35b7379f70777f902c766864cdb6b07769530815..dd83c3c14a8c4ac11940069cb47064ffb8c56fdc 100644 (file)
@@ -239,8 +239,6 @@ dlight_t *r_shadow_selectedlight;
 dlight_t r_shadow_bufferlight;
 vec3_t r_editlights_cursorlocation;
 
-rtexture_t *lighttextures[5];
-
 extern int con_vislines;
 
 typedef struct cubemapinfo_s
@@ -3308,7 +3306,7 @@ void R_Shadow_SelectLight(dlight_t *light)
 void R_Shadow_DrawCursor_TransparentCallback(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight)
 {
        float scale = r_editlights_cursorgrid.value * 0.5f;
-       R_DrawSprite(GL_SRC_ALPHA, GL_ONE, lighttextures[0], NULL, false, r_editlights_cursorlocation, r_viewright, r_viewup, scale, -scale, -scale, scale, 1, 1, 1, 0.5f);
+       R_DrawSprite(GL_SRC_ALPHA, GL_ONE, r_crosshairs[0]->tex, NULL, false, r_editlights_cursorlocation, r_viewright, r_viewup, scale, -scale, -scale, scale, 1, 1, 1, 0.5f);
 }
 
 void R_Shadow_DrawLightSprite_TransparentCallback(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight)
@@ -3320,24 +3318,16 @@ void R_Shadow_DrawLightSprite_TransparentCallback(const entity_render_t *ent, in
                intensity = 0.75 + 0.25 * sin(realtime * M_PI * 4.0);
        if (!light->shadow)
                intensity *= 0.5f;
-       R_DrawSprite(GL_SRC_ALPHA, GL_ONE, lighttextures[surfacenumber], NULL, false, light->origin, r_viewright, r_viewup, 8, -8, -8, 8, intensity, intensity, intensity, 0.5);
+       R_DrawSprite(GL_SRC_ALPHA, GL_ONE, r_crosshairs[surfacenumber]->tex, NULL, false, light->origin, r_viewright, r_viewup, 8, -8, -8, 8, intensity, intensity, intensity, 0.5);
 }
 
 void R_Shadow_DrawLightSprites(void)
 {
        int i;
-       cachepic_t *pic;
        dlight_t *light;
 
-       for (i = 0;i < 5;i++)
-       {
-               lighttextures[i] = NULL;
-               if ((pic = Draw_CachePic(va("gfx/crosshair%i", i + 1), true)))
-                       lighttextures[i] = pic->tex;
-       }
-
        for (i = 0, light = r_shadow_worldlightchain;light;i++, light = light->next)
-               R_MeshQueue_AddTransparent(light->origin, R_Shadow_DrawLightSprite_TransparentCallback, (entity_render_t *)light, i % 5, &light->rtlight);
+               R_MeshQueue_AddTransparent(light->origin, R_Shadow_DrawLightSprite_TransparentCallback, (entity_render_t *)light, i % NUMCROSSHAIRS, &light->rtlight);
        R_MeshQueue_AddTransparent(r_editlights_cursorlocation, R_Shadow_DrawCursor_TransparentCallback, NULL, 0, NULL);
 }
 
diff --git a/sbar.c b/sbar.c
index c921504e9adf7070233aed4118ef2c86c9a1fa7d..486eb15a95c73acd5a440260db936bfe59965463 100644 (file)
--- a/sbar.c
+++ b/sbar.c
@@ -21,83 +21,65 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-typedef struct sbarpic_s
-{
-       char name[32];
-}
-sbarpic_t;
-
-static sbarpic_t sbarpics[256];
-static int numsbarpics;
-
-static sbarpic_t *Sbar_NewPic(const char *name)
-{
-       strcpy(sbarpics[numsbarpics].name, name);
-       // precache it
-       // FIXME: precache on every renderer restart (or move this to client)
-       Draw_CachePic(sbarpics[numsbarpics].name, true);
-       return sbarpics + (numsbarpics++);
-}
-
-sbarpic_t *sb_disc;
+cachepic_t *sb_disc;
 
 #define STAT_MINUS 10 // num frame for '-' stats digit
-sbarpic_t *sb_nums[2][11];
-sbarpic_t *sb_colon, *sb_slash;
-sbarpic_t *sb_ibar;
-sbarpic_t *sb_sbar;
-sbarpic_t *sb_scorebar;
+cachepic_t *sb_nums[2][11];
+cachepic_t *sb_colon, *sb_slash;
+cachepic_t *sb_ibar;
+cachepic_t *sb_sbar;
+cachepic_t *sb_scorebar;
 // AK only used by NEX
-sbarpic_t *sb_sbar_minimal;
-sbarpic_t *sb_sbar_overlay;
+cachepic_t *sb_sbar_minimal;
+cachepic_t *sb_sbar_overlay;
 
 // AK changed the bound to 9
-sbarpic_t *sb_weapons[7][9]; // 0 is active, 1 is owned, 2-5 are flashes
-sbarpic_t *sb_ammo[4];
-sbarpic_t *sb_sigil[4];
-sbarpic_t *sb_armor[3];
-sbarpic_t *sb_items[32];
+cachepic_t *sb_weapons[7][9]; // 0 is active, 1 is owned, 2-5 are flashes
+cachepic_t *sb_ammo[4];
+cachepic_t *sb_sigil[4];
+cachepic_t *sb_armor[3];
+cachepic_t *sb_items[32];
 
 // 0-4 are based on health (in 20 increments)
 // 0 is static, 1 is temporary animation
-sbarpic_t *sb_faces[5][2];
+cachepic_t *sb_faces[5][2];
 
-sbarpic_t *sb_face_invis;
-sbarpic_t *sb_face_quad;
-sbarpic_t *sb_face_invuln;
-sbarpic_t *sb_face_invis_invuln;
+cachepic_t *sb_face_invis;
+cachepic_t *sb_face_quad;
+cachepic_t *sb_face_invuln;
+cachepic_t *sb_face_invis_invuln;
 
 qboolean sb_showscores;
 
 int sb_lines;                  // scan lines to draw
 
-sbarpic_t *rsb_invbar[2];
-sbarpic_t *rsb_weapons[5];
-sbarpic_t *rsb_items[2];
-sbarpic_t *rsb_ammo[3];
-sbarpic_t *rsb_teambord;               // PGM 01/19/97 - team color border
+cachepic_t *rsb_invbar[2];
+cachepic_t *rsb_weapons[5];
+cachepic_t *rsb_items[2];
+cachepic_t *rsb_ammo[3];
+cachepic_t *rsb_teambord;              // PGM 01/19/97 - team color border
 
 //MED 01/04/97 added two more weapons + 3 alternates for grenade launcher
-sbarpic_t *hsb_weapons[7][5];   // 0 is active, 1 is owned, 2-5 are flashes
+cachepic_t *hsb_weapons[7][5];   // 0 is active, 1 is owned, 2-5 are flashes
 //MED 01/04/97 added array to simplify weapon parsing
 int hipweapons[4] = {HIT_LASER_CANNON_BIT,HIT_MJOLNIR_BIT,4,HIT_PROXIMITY_GUN_BIT};
 //MED 01/04/97 added hipnotic items array
-sbarpic_t *hsb_items[2];
+cachepic_t *hsb_items[2];
 
 //GAME_SOM stuff:
-sbarpic_t *somsb_health;
-sbarpic_t *somsb_ammo[4];
-sbarpic_t *somsb_armor[3];
-
-sbarpic_t *zymsb_crosshair_center;
-sbarpic_t *zymsb_crosshair_line;
-sbarpic_t *zymsb_crosshair_health;
-sbarpic_t *zymsb_crosshair_ammo;
-sbarpic_t *zymsb_crosshair_clip;
-sbarpic_t *zymsb_crosshair_background;
-sbarpic_t *zymsb_crosshair_left1;
-sbarpic_t *zymsb_crosshair_left2;
-sbarpic_t *zymsb_crosshair_right;
+cachepic_t *somsb_health;
+cachepic_t *somsb_ammo[4];
+cachepic_t *somsb_armor[3];
+
+cachepic_t *zymsb_crosshair_center;
+cachepic_t *zymsb_crosshair_line;
+cachepic_t *zymsb_crosshair_health;
+cachepic_t *zymsb_crosshair_ammo;
+cachepic_t *zymsb_crosshair_clip;
+cachepic_t *zymsb_crosshair_background;
+cachepic_t *zymsb_crosshair_left1;
+cachepic_t *zymsb_crosshair_left2;
+cachepic_t *zymsb_crosshair_right;
 
 cvar_t showfps = {CVAR_SAVE, "showfps", "0", "shows your rendered fps (frames per second)"};
 cvar_t showtime = {CVAR_SAVE, "showtime", "0", "shows current time of day (useful on screenshots)"};
@@ -145,194 +127,192 @@ void sbar_start(void)
 {
        int i;
 
-       numsbarpics = 0;
-
        if (gamemode == GAME_NETHERWORLD)
        {
        }
        else if (gamemode == GAME_SOM)
        {
-               sb_disc = Sbar_NewPic("gfx/disc");
+               sb_disc = Draw_CachePic("gfx/disc", false);
 
                for (i = 0;i < 10;i++)
-                       sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i));
-
-               somsb_health = Sbar_NewPic("gfx/hud_health");
-               somsb_ammo[0] = Sbar_NewPic("gfx/sb_shells");
-               somsb_ammo[1] = Sbar_NewPic("gfx/sb_nails");
-               somsb_ammo[2] = Sbar_NewPic("gfx/sb_rocket");
-               somsb_ammo[3] = Sbar_NewPic("gfx/sb_cells");
-               somsb_armor[0] = Sbar_NewPic("gfx/sb_armor1");
-               somsb_armor[1] = Sbar_NewPic("gfx/sb_armor2");
-               somsb_armor[2] = Sbar_NewPic("gfx/sb_armor3");
+                       sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), false);
+
+               somsb_health = Draw_CachePic("gfx/hud_health", false);
+               somsb_ammo[0] = Draw_CachePic("gfx/sb_shells", false);
+               somsb_ammo[1] = Draw_CachePic("gfx/sb_nails", false);
+               somsb_ammo[2] = Draw_CachePic("gfx/sb_rocket", false);
+               somsb_ammo[3] = Draw_CachePic("gfx/sb_cells", false);
+               somsb_armor[0] = Draw_CachePic("gfx/sb_armor1", false);
+               somsb_armor[1] = Draw_CachePic("gfx/sb_armor2", false);
+               somsb_armor[2] = Draw_CachePic("gfx/sb_armor3", false);
        }
        else if (gamemode == GAME_NEXUIZ)
        {
                for (i = 0;i < 10;i++)
-                       sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i));
-               sb_nums[0][10] = Sbar_NewPic ("gfx/num_minus");
+                       sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), false);
+               sb_nums[0][10] = Draw_CachePic ("gfx/num_minus", false);
 
-               sb_ammo[0] = Sbar_NewPic ("gfx/sb_shells");
-               sb_ammo[1] = Sbar_NewPic ("gfx/sb_bullets");
-               sb_ammo[2] = Sbar_NewPic ("gfx/sb_rocket");
-               sb_ammo[3] = Sbar_NewPic ("gfx/sb_cells");
+               sb_ammo[0] = Draw_CachePic ("gfx/sb_shells", false);
+               sb_ammo[1] = Draw_CachePic ("gfx/sb_bullets", false);
+               sb_ammo[2] = Draw_CachePic ("gfx/sb_rocket", false);
+               sb_ammo[3] = Draw_CachePic ("gfx/sb_cells", false);
 
-               sb_items[2] = Sbar_NewPic ("gfx/sb_slowmo");
-               sb_items[3] = Sbar_NewPic ("gfx/sb_invinc");
-               sb_items[4] = Sbar_NewPic ("gfx/sb_energy");
-               sb_items[5] = Sbar_NewPic ("gfx/sb_str");
+               sb_items[2] = Draw_CachePic ("gfx/sb_slowmo", false);
+               sb_items[3] = Draw_CachePic ("gfx/sb_invinc", false);
+               sb_items[4] = Draw_CachePic ("gfx/sb_energy", false);
+               sb_items[5] = Draw_CachePic ("gfx/sb_str", false);
 
-               sb_sbar = Sbar_NewPic("gfx/sbar");
-               sb_sbar_minimal = Sbar_NewPic("gfx/sbar_minimal");
-               sb_sbar_overlay = Sbar_NewPic("gfx/sbar_overlay");
+               sb_sbar = Draw_CachePic("gfx/sbar", false);
+               sb_sbar_minimal = Draw_CachePic("gfx/sbar_minimal", false);
+               sb_sbar_overlay = Draw_CachePic("gfx/sbar_overlay", false);
 
                for(i = 0; i < 9;i++)
-                       sb_weapons[0][i] = Sbar_NewPic(va("gfx/inv_weapon%i",i));
+                       sb_weapons[0][i] = Draw_CachePic(va("gfx/inv_weapon%i",i), false);
        }
        else if (gamemode == GAME_ZYMOTIC)
        {
-               zymsb_crosshair_center = Sbar_NewPic ("gfx/hud/crosshair_center");
-               zymsb_crosshair_line = Sbar_NewPic ("gfx/hud/crosshair_line");
-               zymsb_crosshair_health = Sbar_NewPic ("gfx/hud/crosshair_health");
-               zymsb_crosshair_clip = Sbar_NewPic ("gfx/hud/crosshair_clip");
-               zymsb_crosshair_ammo = Sbar_NewPic ("gfx/hud/crosshair_ammo");
-               zymsb_crosshair_background = Sbar_NewPic ("gfx/hud/crosshair_background");
-               zymsb_crosshair_left1 = Sbar_NewPic ("gfx/hud/crosshair_left1");
-               zymsb_crosshair_left2 = Sbar_NewPic ("gfx/hud/crosshair_left2");
-               zymsb_crosshair_right = Sbar_NewPic ("gfx/hud/crosshair_right");
+               zymsb_crosshair_center = Draw_CachePic ("gfx/hud/crosshair_center", false);
+               zymsb_crosshair_line = Draw_CachePic ("gfx/hud/crosshair_line", false);
+               zymsb_crosshair_health = Draw_CachePic ("gfx/hud/crosshair_health", false);
+               zymsb_crosshair_clip = Draw_CachePic ("gfx/hud/crosshair_clip", false);
+               zymsb_crosshair_ammo = Draw_CachePic ("gfx/hud/crosshair_ammo", false);
+               zymsb_crosshair_background = Draw_CachePic ("gfx/hud/crosshair_background", false);
+               zymsb_crosshair_left1 = Draw_CachePic ("gfx/hud/crosshair_left1", false);
+               zymsb_crosshair_left2 = Draw_CachePic ("gfx/hud/crosshair_left2", false);
+               zymsb_crosshair_right = Draw_CachePic ("gfx/hud/crosshair_right", false);
        }
        else
        {
-               sb_disc = Sbar_NewPic("gfx/disc");
+               sb_disc = Draw_CachePic("gfx/disc", false);
 
                for (i = 0;i < 10;i++)
                {
-                       sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i));
-                       sb_nums[1][i] = Sbar_NewPic (va("gfx/anum_%i",i));
+                       sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), false);
+                       sb_nums[1][i] = Draw_CachePic (va("gfx/anum_%i",i), false);
                }
 
-               sb_nums[0][10] = Sbar_NewPic ("gfx/num_minus");
-               sb_nums[1][10] = Sbar_NewPic ("gfx/anum_minus");
+               sb_nums[0][10] = Draw_CachePic ("gfx/num_minus", false);
+               sb_nums[1][10] = Draw_CachePic ("gfx/anum_minus", false);
 
-               sb_colon = Sbar_NewPic ("gfx/num_colon");
-               sb_slash = Sbar_NewPic ("gfx/num_slash");
+               sb_colon = Draw_CachePic ("gfx/num_colon", false);
+               sb_slash = Draw_CachePic ("gfx/num_slash", false);
 
-               sb_weapons[0][0] = Sbar_NewPic ("gfx/inv_shotgun");
-               sb_weapons[0][1] = Sbar_NewPic ("gfx/inv_sshotgun");
-               sb_weapons[0][2] = Sbar_NewPic ("gfx/inv_nailgun");
-               sb_weapons[0][3] = Sbar_NewPic ("gfx/inv_snailgun");
-               sb_weapons[0][4] = Sbar_NewPic ("gfx/inv_rlaunch");
-               sb_weapons[0][5] = Sbar_NewPic ("gfx/inv_srlaunch");
-               sb_weapons[0][6] = Sbar_NewPic ("gfx/inv_lightng");
+               sb_weapons[0][0] = Draw_CachePic ("gfx/inv_shotgun", false);
+               sb_weapons[0][1] = Draw_CachePic ("gfx/inv_sshotgun", false);
+               sb_weapons[0][2] = Draw_CachePic ("gfx/inv_nailgun", false);
+               sb_weapons[0][3] = Draw_CachePic ("gfx/inv_snailgun", false);
+               sb_weapons[0][4] = Draw_CachePic ("gfx/inv_rlaunch", false);
+               sb_weapons[0][5] = Draw_CachePic ("gfx/inv_srlaunch", false);
+               sb_weapons[0][6] = Draw_CachePic ("gfx/inv_lightng", false);
 
-               sb_weapons[1][0] = Sbar_NewPic ("gfx/inv2_shotgun");
-               sb_weapons[1][1] = Sbar_NewPic ("gfx/inv2_sshotgun");
-               sb_weapons[1][2] = Sbar_NewPic ("gfx/inv2_nailgun");
-               sb_weapons[1][3] = Sbar_NewPic ("gfx/inv2_snailgun");
-               sb_weapons[1][4] = Sbar_NewPic ("gfx/inv2_rlaunch");
-               sb_weapons[1][5] = Sbar_NewPic ("gfx/inv2_srlaunch");
-               sb_weapons[1][6] = Sbar_NewPic ("gfx/inv2_lightng");
+               sb_weapons[1][0] = Draw_CachePic ("gfx/inv2_shotgun", false);
+               sb_weapons[1][1] = Draw_CachePic ("gfx/inv2_sshotgun", false);
+               sb_weapons[1][2] = Draw_CachePic ("gfx/inv2_nailgun", false);
+               sb_weapons[1][3] = Draw_CachePic ("gfx/inv2_snailgun", false);
+               sb_weapons[1][4] = Draw_CachePic ("gfx/inv2_rlaunch", false);
+               sb_weapons[1][5] = Draw_CachePic ("gfx/inv2_srlaunch", false);
+               sb_weapons[1][6] = Draw_CachePic ("gfx/inv2_lightng", false);
 
                for (i = 0;i < 5;i++)
                {
-                       sb_weapons[2+i][0] = Sbar_NewPic (va("gfx/inva%i_shotgun",i+1));
-                       sb_weapons[2+i][1] = Sbar_NewPic (va("gfx/inva%i_sshotgun",i+1));
-                       sb_weapons[2+i][2] = Sbar_NewPic (va("gfx/inva%i_nailgun",i+1));
-                       sb_weapons[2+i][3] = Sbar_NewPic (va("gfx/inva%i_snailgun",i+1));
-                       sb_weapons[2+i][4] = Sbar_NewPic (va("gfx/inva%i_rlaunch",i+1));
-                       sb_weapons[2+i][5] = Sbar_NewPic (va("gfx/inva%i_srlaunch",i+1));
-                       sb_weapons[2+i][6] = Sbar_NewPic (va("gfx/inva%i_lightng",i+1));
+                       sb_weapons[2+i][0] = Draw_CachePic (va("gfx/inva%i_shotgun",i+1), false);
+                       sb_weapons[2+i][1] = Draw_CachePic (va("gfx/inva%i_sshotgun",i+1), false);
+                       sb_weapons[2+i][2] = Draw_CachePic (va("gfx/inva%i_nailgun",i+1), false);
+                       sb_weapons[2+i][3] = Draw_CachePic (va("gfx/inva%i_snailgun",i+1), false);
+                       sb_weapons[2+i][4] = Draw_CachePic (va("gfx/inva%i_rlaunch",i+1), false);
+                       sb_weapons[2+i][5] = Draw_CachePic (va("gfx/inva%i_srlaunch",i+1), false);
+                       sb_weapons[2+i][6] = Draw_CachePic (va("gfx/inva%i_lightng",i+1), false);
                }
 
-               sb_ammo[0] = Sbar_NewPic ("gfx/sb_shells");
-               sb_ammo[1] = Sbar_NewPic ("gfx/sb_nails");
-               sb_ammo[2] = Sbar_NewPic ("gfx/sb_rocket");
-               sb_ammo[3] = Sbar_NewPic ("gfx/sb_cells");
-
-               sb_armor[0] = Sbar_NewPic ("gfx/sb_armor1");
-               sb_armor[1] = Sbar_NewPic ("gfx/sb_armor2");
-               sb_armor[2] = Sbar_NewPic ("gfx/sb_armor3");
-
-               sb_items[0] = Sbar_NewPic ("gfx/sb_key1");
-               sb_items[1] = Sbar_NewPic ("gfx/sb_key2");
-               sb_items[2] = Sbar_NewPic ("gfx/sb_invis");
-               sb_items[3] = Sbar_NewPic ("gfx/sb_invuln");
-               sb_items[4] = Sbar_NewPic ("gfx/sb_suit");
-               sb_items[5] = Sbar_NewPic ("gfx/sb_quad");
-
-               sb_sigil[0] = Sbar_NewPic ("gfx/sb_sigil1");
-               sb_sigil[1] = Sbar_NewPic ("gfx/sb_sigil2");
-               sb_sigil[2] = Sbar_NewPic ("gfx/sb_sigil3");
-               sb_sigil[3] = Sbar_NewPic ("gfx/sb_sigil4");
-
-               sb_faces[4][0] = Sbar_NewPic ("gfx/face1");
-               sb_faces[4][1] = Sbar_NewPic ("gfx/face_p1");
-               sb_faces[3][0] = Sbar_NewPic ("gfx/face2");
-               sb_faces[3][1] = Sbar_NewPic ("gfx/face_p2");
-               sb_faces[2][0] = Sbar_NewPic ("gfx/face3");
-               sb_faces[2][1] = Sbar_NewPic ("gfx/face_p3");
-               sb_faces[1][0] = Sbar_NewPic ("gfx/face4");
-               sb_faces[1][1] = Sbar_NewPic ("gfx/face_p4");
-               sb_faces[0][0] = Sbar_NewPic ("gfx/face5");
-               sb_faces[0][1] = Sbar_NewPic ("gfx/face_p5");
-
-               sb_face_invis = Sbar_NewPic ("gfx/face_invis");
-               sb_face_invuln = Sbar_NewPic ("gfx/face_invul2");
-               sb_face_invis_invuln = Sbar_NewPic ("gfx/face_inv2");
-               sb_face_quad = Sbar_NewPic ("gfx/face_quad");
-
-               sb_sbar = Sbar_NewPic ("gfx/sbar");
-               sb_ibar = Sbar_NewPic ("gfx/ibar");
-               sb_scorebar = Sbar_NewPic ("gfx/scorebar");
+               sb_ammo[0] = Draw_CachePic ("gfx/sb_shells", false);
+               sb_ammo[1] = Draw_CachePic ("gfx/sb_nails", false);
+               sb_ammo[2] = Draw_CachePic ("gfx/sb_rocket", false);
+               sb_ammo[3] = Draw_CachePic ("gfx/sb_cells", false);
+
+               sb_armor[0] = Draw_CachePic ("gfx/sb_armor1", false);
+               sb_armor[1] = Draw_CachePic ("gfx/sb_armor2", false);
+               sb_armor[2] = Draw_CachePic ("gfx/sb_armor3", false);
+
+               sb_items[0] = Draw_CachePic ("gfx/sb_key1", false);
+               sb_items[1] = Draw_CachePic ("gfx/sb_key2", false);
+               sb_items[2] = Draw_CachePic ("gfx/sb_invis", false);
+               sb_items[3] = Draw_CachePic ("gfx/sb_invuln", false);
+               sb_items[4] = Draw_CachePic ("gfx/sb_suit", false);
+               sb_items[5] = Draw_CachePic ("gfx/sb_quad", false);
+
+               sb_sigil[0] = Draw_CachePic ("gfx/sb_sigil1", false);
+               sb_sigil[1] = Draw_CachePic ("gfx/sb_sigil2", false);
+               sb_sigil[2] = Draw_CachePic ("gfx/sb_sigil3", false);
+               sb_sigil[3] = Draw_CachePic ("gfx/sb_sigil4", false);
+
+               sb_faces[4][0] = Draw_CachePic ("gfx/face1", false);
+               sb_faces[4][1] = Draw_CachePic ("gfx/face_p1", false);
+               sb_faces[3][0] = Draw_CachePic ("gfx/face2", false);
+               sb_faces[3][1] = Draw_CachePic ("gfx/face_p2", false);
+               sb_faces[2][0] = Draw_CachePic ("gfx/face3", false);
+               sb_faces[2][1] = Draw_CachePic ("gfx/face_p3", false);
+               sb_faces[1][0] = Draw_CachePic ("gfx/face4", false);
+               sb_faces[1][1] = Draw_CachePic ("gfx/face_p4", false);
+               sb_faces[0][0] = Draw_CachePic ("gfx/face5", false);
+               sb_faces[0][1] = Draw_CachePic ("gfx/face_p5", false);
+
+               sb_face_invis = Draw_CachePic ("gfx/face_invis", false);
+               sb_face_invuln = Draw_CachePic ("gfx/face_invul2", false);
+               sb_face_invis_invuln = Draw_CachePic ("gfx/face_inv2", false);
+               sb_face_quad = Draw_CachePic ("gfx/face_quad", false);
+
+               sb_sbar = Draw_CachePic ("gfx/sbar", false);
+               sb_ibar = Draw_CachePic ("gfx/ibar", false);
+               sb_scorebar = Draw_CachePic ("gfx/scorebar", false);
 
        //MED 01/04/97 added new hipnotic weapons
                if (gamemode == GAME_HIPNOTIC)
                {
-                       hsb_weapons[0][0] = Sbar_NewPic ("gfx/inv_laser");
-                       hsb_weapons[0][1] = Sbar_NewPic ("gfx/inv_mjolnir");
-                       hsb_weapons[0][2] = Sbar_NewPic ("gfx/inv_gren_prox");
-                       hsb_weapons[0][3] = Sbar_NewPic ("gfx/inv_prox_gren");
-                       hsb_weapons[0][4] = Sbar_NewPic ("gfx/inv_prox");
-
-                       hsb_weapons[1][0] = Sbar_NewPic ("gfx/inv2_laser");
-                       hsb_weapons[1][1] = Sbar_NewPic ("gfx/inv2_mjolnir");
-                       hsb_weapons[1][2] = Sbar_NewPic ("gfx/inv2_gren_prox");
-                       hsb_weapons[1][3] = Sbar_NewPic ("gfx/inv2_prox_gren");
-                       hsb_weapons[1][4] = Sbar_NewPic ("gfx/inv2_prox");
+                       hsb_weapons[0][0] = Draw_CachePic ("gfx/inv_laser", false);
+                       hsb_weapons[0][1] = Draw_CachePic ("gfx/inv_mjolnir", false);
+                       hsb_weapons[0][2] = Draw_CachePic ("gfx/inv_gren_prox", false);
+                       hsb_weapons[0][3] = Draw_CachePic ("gfx/inv_prox_gren", false);
+                       hsb_weapons[0][4] = Draw_CachePic ("gfx/inv_prox", false);
+
+                       hsb_weapons[1][0] = Draw_CachePic ("gfx/inv2_laser", false);
+                       hsb_weapons[1][1] = Draw_CachePic ("gfx/inv2_mjolnir", false);
+                       hsb_weapons[1][2] = Draw_CachePic ("gfx/inv2_gren_prox", false);
+                       hsb_weapons[1][3] = Draw_CachePic ("gfx/inv2_prox_gren", false);
+                       hsb_weapons[1][4] = Draw_CachePic ("gfx/inv2_prox", false);
 
                        for (i = 0;i < 5;i++)
                        {
-                               hsb_weapons[2+i][0] = Sbar_NewPic (va("gfx/inva%i_laser",i+1));
-                               hsb_weapons[2+i][1] = Sbar_NewPic (va("gfx/inva%i_mjolnir",i+1));
-                               hsb_weapons[2+i][2] = Sbar_NewPic (va("gfx/inva%i_gren_prox",i+1));
-                               hsb_weapons[2+i][3] = Sbar_NewPic (va("gfx/inva%i_prox_gren",i+1));
-                               hsb_weapons[2+i][4] = Sbar_NewPic (va("gfx/inva%i_prox",i+1));
+                               hsb_weapons[2+i][0] = Draw_CachePic (va("gfx/inva%i_laser",i+1), false);
+                               hsb_weapons[2+i][1] = Draw_CachePic (va("gfx/inva%i_mjolnir",i+1), false);
+                               hsb_weapons[2+i][2] = Draw_CachePic (va("gfx/inva%i_gren_prox",i+1), false);
+                               hsb_weapons[2+i][3] = Draw_CachePic (va("gfx/inva%i_prox_gren",i+1), false);
+                               hsb_weapons[2+i][4] = Draw_CachePic (va("gfx/inva%i_prox",i+1), false);
                        }
 
-                       hsb_items[0] = Sbar_NewPic ("gfx/sb_wsuit");
-                       hsb_items[1] = Sbar_NewPic ("gfx/sb_eshld");
+                       hsb_items[0] = Draw_CachePic ("gfx/sb_wsuit", false);
+                       hsb_items[1] = Draw_CachePic ("gfx/sb_eshld", false);
                }
                else if (gamemode == GAME_ROGUE)
                {
-                       rsb_invbar[0] = Sbar_NewPic ("gfx/r_invbar1");
-                       rsb_invbar[1] = Sbar_NewPic ("gfx/r_invbar2");
+                       rsb_invbar[0] = Draw_CachePic ("gfx/r_invbar1", false);
+                       rsb_invbar[1] = Draw_CachePic ("gfx/r_invbar2", false);
 
-                       rsb_weapons[0] = Sbar_NewPic ("gfx/r_lava");
-                       rsb_weapons[1] = Sbar_NewPic ("gfx/r_superlava");
-                       rsb_weapons[2] = Sbar_NewPic ("gfx/r_gren");
-                       rsb_weapons[3] = Sbar_NewPic ("gfx/r_multirock");
-                       rsb_weapons[4] = Sbar_NewPic ("gfx/r_plasma");
+                       rsb_weapons[0] = Draw_CachePic ("gfx/r_lava", false);
+                       rsb_weapons[1] = Draw_CachePic ("gfx/r_superlava", false);
+                       rsb_weapons[2] = Draw_CachePic ("gfx/r_gren", false);
+                       rsb_weapons[3] = Draw_CachePic ("gfx/r_multirock", false);
+                       rsb_weapons[4] = Draw_CachePic ("gfx/r_plasma", false);
 
-                       rsb_items[0] = Sbar_NewPic ("gfx/r_shield1");
-                       rsb_items[1] = Sbar_NewPic ("gfx/r_agrav1");
+                       rsb_items[0] = Draw_CachePic ("gfx/r_shield1", false);
+                       rsb_items[1] = Draw_CachePic ("gfx/r_agrav1", false);
 
        // PGM 01/19/97 - team color border
-                       rsb_teambord = Sbar_NewPic ("gfx/r_teambord");
+                       rsb_teambord = Draw_CachePic ("gfx/r_teambord", false);
        // PGM 01/19/97 - team color border
 
-                       rsb_ammo[0] = Sbar_NewPic ("gfx/r_ammolava");
-                       rsb_ammo[1] = Sbar_NewPic ("gfx/r_ammomulti");
-                       rsb_ammo[2] = Sbar_NewPic ("gfx/r_ammoplasma");
+                       rsb_ammo[0] = Draw_CachePic ("gfx/r_ammolava", false);
+                       rsb_ammo[1] = Draw_CachePic ("gfx/r_ammomulti", false);
+                       rsb_ammo[2] = Draw_CachePic ("gfx/r_ammoplasma", false);
                }
        }
 }
@@ -373,14 +353,14 @@ int sbar_x, sbar_y;
 Sbar_DrawPic
 =============
 */
-void Sbar_DrawPic (int x, int y, sbarpic_t *sbarpic)
+void Sbar_DrawPic (int x, int y, cachepic_t *pic)
 {
-       DrawQ_Pic (sbar_x + x, sbar_y + y, sbarpic->name, 0, 0, 1, 1, 1, sbar_alpha_fg.value, 0);
+       DrawQ_Pic (sbar_x + x, sbar_y + y, pic, 0, 0, 1, 1, 1, sbar_alpha_fg.value, 0);
 }
 
-void Sbar_DrawAlphaPic (int x, int y, sbarpic_t *sbarpic, float alpha)
+void Sbar_DrawAlphaPic (int x, int y, cachepic_t *pic, float alpha)
 {
-       DrawQ_Pic (sbar_x + x, sbar_y + y, sbarpic->name, 0, 0, 1, 1, 1, alpha, 0);
+       DrawQ_Pic (sbar_x + x, sbar_y + y, pic, 0, 0, 1, 1, 1, alpha, 0);
 }
 
 /*
@@ -461,7 +441,7 @@ void Sbar_DrawXNum (int x, int y, int num, int digits, int lettersize, float r,
                else
                        frame = *ptr -'0';
 
-               DrawQ_Pic (sbar_x + x, sbar_y + y, sb_nums[0][frame]->name,lettersize,lettersize,r,g,b,a * sbar_alpha_fg.value,flags);
+               DrawQ_Pic (sbar_x + x, sbar_y + y, sb_nums[0][frame],lettersize,lettersize,r,g,b,a * sbar_alpha_fg.value,flags);
                x += lettersize;
 
                ptr++;
@@ -653,11 +633,11 @@ static void Sbar_DrawWeapon(int nr, float fade, int active)
        const int w_width = 300, w_height = 100, w_space = 10;
        const float w_scale = 0.4;
 
-       DrawQ_Pic(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, sb_weapons[0][nr]->name, w_width * w_scale, w_height * w_scale, (active) ? 1 : 0.6, active ? 1 : 0.6, active ? 1 : 1, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE);
+       DrawQ_Pic(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, sb_weapons[0][nr], w_width * w_scale, w_height * w_scale, (active) ? 1 : 0.6, active ? 1 : 0.6, active ? 1 : 1, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE);
        //DrawQ_String(vid_conwidth.integer - (w_space + font_size ), (w_height + w_space) * w_scale * nr + w_space, va("%i",nr+1), 0, font_size, font_size, 1, 0, 0, fade, 0);
 
        if (active)
-               DrawQ_Fill(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, w_width * w_scale, w_height * w_scale, 0.3, 0.3, 0.3, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE);
+               DrawQ_Pic(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, NULL, w_width * w_scale, w_height * w_scale, 0.3, 0.3, 0.3, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE);
 }
 
 /*
@@ -835,9 +815,9 @@ void Sbar_DrawFrags (void)
 
                // draw background
                c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8];
-               DrawQ_Fill (sbar_x + x + 10, sbar_y     - 23, 28, 4, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic (sbar_x + x + 10, sbar_y     - 23, NULL, 28, 4, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8];
-               DrawQ_Fill (sbar_x + x + 10, sbar_y + 4 - 23, 28, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic (sbar_x + x + 10, sbar_y + 4 - 23, NULL, 28, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
 
                // draw number
                f = s->frags;
@@ -879,9 +859,9 @@ void Sbar_DrawFace (void)
                // draw background
                Sbar_DrawPic (112, 0, rsb_teambord);
                c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8];
-               DrawQ_Fill (sbar_x + 113, vid_conheight.integer-SBAR_HEIGHT+3, 22, 9, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic (sbar_x + 113, vid_conheight.integer-SBAR_HEIGHT+3, NULL, 22, 9, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8];
-               DrawQ_Fill (sbar_x + 113, vid_conheight.integer-SBAR_HEIGHT+12, 22, 9, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic (sbar_x + 113, vid_conheight.integer-SBAR_HEIGHT+12, NULL, 22, 9, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
 
                // draw number
                f = s->frags;
@@ -998,7 +978,7 @@ void Sbar_ShowFPS(void)
                if (fpsstring[0])
                {
                        fps_x = vid_conwidth.integer - fps_scalex * strlen(fpsstring);
-                       DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(fpsstring), fps_scaley, 0, 0, 0, 0.5, 0);
+                       DrawQ_Pic(fps_x, fps_y, NULL, fps_scalex * strlen(fpsstring), fps_scaley, 0, 0, 0, 0.5, 0);
                        if (red)
                                DrawQ_String(fps_x, fps_y, fpsstring, 0, fps_scalex, fps_scaley, 1, 0, 0, 1, 0);
                        else
@@ -1008,21 +988,21 @@ void Sbar_ShowFPS(void)
                if (timestring[0])
                {
                        fps_x = vid_conwidth.integer - fps_scalex * strlen(timestring);
-                       DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(timestring), fps_scaley, 0, 0, 0, 0.5, 0);
+                       DrawQ_Pic(fps_x, fps_y, NULL, fps_scalex * strlen(timestring), fps_scaley, 0, 0, 0, 0.5, 0);
                        DrawQ_String(fps_x, fps_y, timestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0);
                        fps_y += fps_scaley;
                }
                if (datestring[0])
                {
                        fps_x = vid_conwidth.integer - fps_scalex * strlen(datestring);
-                       DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(datestring), fps_scaley, 0, 0, 0, 0.5, 0);
+                       DrawQ_Pic(fps_x, fps_y, NULL, fps_scalex * strlen(datestring), fps_scaley, 0, 0, 0, 0.5, 0);
                        DrawQ_String(fps_x, fps_y, datestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0);
                        fps_y += fps_scaley;
                }
        }
 }
 
-void Sbar_DrawGauge(float x, float y, const char *picname, float width, float height, float rangey, float rangeheight, float c1, float c2, float c1r, float c1g, float c1b, float c1a, float c2r, float c2g, float c2b, float c2a, float c3r, float c3g, float c3b, float c3a, int drawflags)
+void Sbar_DrawGauge(float x, float y, cachepic_t *pic, float width, float height, float rangey, float rangeheight, float c1, float c2, float c1r, float c1g, float c1b, float c1a, float c2r, float c2g, float c2b, float c2a, float c3r, float c3g, float c3b, float c3a, int drawflags)
 {
        float r[5];
        c2 = bound(0, c2, 1);
@@ -1033,13 +1013,13 @@ void Sbar_DrawGauge(float x, float y, const char *picname, float width, float he
        r[3] = rangey;
        r[4] = height;
        if (r[1] > r[0])
-               DrawQ_SuperPic(x, y + r[0], picname, width, (r[1] - r[0]), 0,(r[0] / height), c3r,c3g,c3b,c3a, 1,(r[0] / height), c3r,c3g,c3b,c3a, 0,(r[1] / height), c3r,c3g,c3b,c3a, 1,(r[1] / height), c3r,c3g,c3b,c3a, drawflags);
+               DrawQ_SuperPic(x, y + r[0], pic, width, (r[1] - r[0]), 0,(r[0] / height), c3r,c3g,c3b,c3a, 1,(r[0] / height), c3r,c3g,c3b,c3a, 0,(r[1] / height), c3r,c3g,c3b,c3a, 1,(r[1] / height), c3r,c3g,c3b,c3a, drawflags);
        if (r[2] > r[1])
-               DrawQ_SuperPic(x, y + r[1], picname, width, (r[2] - r[1]), 0,(r[1] / height), c1r,c1g,c1b,c1a, 1,(r[1] / height), c1r,c1g,c1b,c1a, 0,(r[2] / height), c1r,c1g,c1b,c1a, 1,(r[2] / height), c1r,c1g,c1b,c1a, drawflags);
+               DrawQ_SuperPic(x, y + r[1], pic, width, (r[2] - r[1]), 0,(r[1] / height), c1r,c1g,c1b,c1a, 1,(r[1] / height), c1r,c1g,c1b,c1a, 0,(r[2] / height), c1r,c1g,c1b,c1a, 1,(r[2] / height), c1r,c1g,c1b,c1a, drawflags);
        if (r[3] > r[2])
-               DrawQ_SuperPic(x, y + r[2], picname, width, (r[3] - r[2]), 0,(r[2] / height), c2r,c2g,c2b,c2a, 1,(r[2] / height), c2r,c2g,c2b,c2a, 0,(r[3] / height), c2r,c2g,c2b,c2a, 1,(r[3] / height), c2r,c2g,c2b,c2a, drawflags);
+               DrawQ_SuperPic(x, y + r[2], pic, width, (r[3] - r[2]), 0,(r[2] / height), c2r,c2g,c2b,c2a, 1,(r[2] / height), c2r,c2g,c2b,c2a, 0,(r[3] / height), c2r,c2g,c2b,c2a, 1,(r[3] / height), c2r,c2g,c2b,c2a, drawflags);
        if (r[4] > r[3])
-               DrawQ_SuperPic(x, y + r[3], picname, width, (r[4] - r[3]), 0,(r[3] / height), c3r,c3g,c3b,c3a, 1,(r[3] / height), c3r,c3g,c3b,c3a, 0,(r[4] / height), c3r,c3g,c3b,c3a, 1,(r[4] / height), c3r,c3g,c3b,c3a, drawflags);
+               DrawQ_SuperPic(x, y + r[3], pic, width, (r[4] - r[3]), 0,(r[3] / height), c3r,c3g,c3b,c3a, 1,(r[3] / height), c3r,c3g,c3b,c3a, 0,(r[4] / height), c3r,c3g,c3b,c3a, 1,(r[4] / height), c3r,c3g,c3b,c3a, drawflags);
 }
 
 /*
@@ -1184,7 +1164,7 @@ void Sbar_Draw (void)
                                }
 
                                if (sb_lines > 24)
-                                       DrawQ_Pic(sbar_x,sbar_y,sb_sbar_overlay->name,0,0,1,1,1,1,DRAWFLAG_MODULATE);
+                                       DrawQ_Pic(sbar_x,sbar_y,sb_sbar_overlay,0,0,1,1,1,1,DRAWFLAG_MODULATE);
                        }
 
                        //if (vid_conwidth.integer > 320 && cl.gametype == GAME_DEATHMATCH)
@@ -1192,7 +1172,7 @@ void Sbar_Draw (void)
                }
                else if (gamemode == GAME_ZYMOTIC)
                {
-       #if 1
+#if 1
                        float scale = 64.0f / 256.0f;
                        float kickoffset[3];
                        VectorClear(kickoffset);
@@ -1206,11 +1186,11 @@ void Sbar_Draw (void)
                        // left1 16, 48 : 126 -66
                        // left2 16, 128 : 196 -66
                        // right 176, 48 : 196 -136
-                       Sbar_DrawGauge(sbar_x +  16 * scale, sbar_y +  48 * scale, zymsb_crosshair_left1->name, 64*scale,  80*scale, 78*scale,  -66*scale, cl.stats[STAT_AMMO]  * (1.0 / 200.0), cl.stats[STAT_SHELLS]  * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
-                       Sbar_DrawGauge(sbar_x +  16 * scale, sbar_y + 128 * scale, zymsb_crosshair_left2->name, 64*scale,  80*scale, 68*scale,  -66*scale, cl.stats[STAT_NAILS] * (1.0 / 200.0), cl.stats[STAT_ROCKETS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
-                       Sbar_DrawGauge(sbar_x + 176 * scale, sbar_y +  48 * scale, zymsb_crosshair_right->name, 64*scale, 160*scale, 148*scale, -136*scale, cl.stats[STAT_ARMOR]  * (1.0 / 300.0), cl.stats[STAT_HEALTH]  * (1.0 / 300.0), 0.0f,0.5f,1.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
-                       DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center->name, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
-       #else
+                       Sbar_DrawGauge(sbar_x +  16 * scale, sbar_y +  48 * scale, zymsb_crosshair_left1, 64*scale,  80*scale, 78*scale,  -66*scale, cl.stats[STAT_AMMO]  * (1.0 / 200.0), cl.stats[STAT_SHELLS]  * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
+                       Sbar_DrawGauge(sbar_x +  16 * scale, sbar_y + 128 * scale, zymsb_crosshair_left2, 64*scale,  80*scale, 68*scale,  -66*scale, cl.stats[STAT_NAILS] * (1.0 / 200.0), cl.stats[STAT_ROCKETS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
+                       Sbar_DrawGauge(sbar_x + 176 * scale, sbar_y +  48 * scale, zymsb_crosshair_right, 64*scale, 160*scale, 148*scale, -136*scale, cl.stats[STAT_ARMOR]  * (1.0 / 300.0), cl.stats[STAT_HEALTH]  * (1.0 / 300.0), 0.0f,0.5f,1.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL);
+                       DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
+#else
                        float scale = 128.0f / 256.0f;
                        float healthstart, healthheight, healthstarttc, healthendtc;
                        float shieldstart, shieldheight, shieldstarttc, shieldendtc;
@@ -1226,10 +1206,10 @@ void Sbar_Draw (void)
                        sbar_x = (vid_conwidth.integer - 256 * scale)/2 + kickoffset[0];
                        sbar_y = (vid_conheight.integer - 256 * scale)/2 + kickoffset[1];
                        offset = 0; // TODO: offset should be controlled by recoil (question: how to detect firing?)
-                       DrawQ_SuperPic(sbar_x +  120           * scale, sbar_y + ( 88 - offset) * scale, zymsb_crosshair_line->name, 16 * scale, 36 * scale, 0,0, 1,1,1,1, 1,0, 1,1,1,1, 0,1, 1,1,1,1, 1,1, 1,1,1,1, 0);
-                       DrawQ_SuperPic(sbar_x + (132 + offset) * scale, sbar_y + 120            * scale, zymsb_crosshair_line->name, 36 * scale, 16 * scale, 0,1, 1,1,1,1, 0,0, 1,1,1,1, 1,1, 1,1,1,1, 1,0, 1,1,1,1, 0);
-                       DrawQ_SuperPic(sbar_x +  120           * scale, sbar_y + (132 + offset) * scale, zymsb_crosshair_line->name, 16 * scale, 36 * scale, 1,1, 1,1,1,1, 0,1, 1,1,1,1, 1,0, 1,1,1,1, 0,0, 1,1,1,1, 0);
-                       DrawQ_SuperPic(sbar_x + ( 88 - offset) * scale, sbar_y + 120            * scale, zymsb_crosshair_line->name, 36 * scale, 16 * scale, 1,0, 1,1,1,1, 1,1, 1,1,1,1, 0,0, 1,1,1,1, 0,1, 1,1,1,1, 0);
+                       DrawQ_SuperPic(sbar_x +  120           * scale, sbar_y + ( 88 - offset) * scale, zymsb_crosshair_line, 16 * scale, 36 * scale, 0,0, 1,1,1,1, 1,0, 1,1,1,1, 0,1, 1,1,1,1, 1,1, 1,1,1,1, 0);
+                       DrawQ_SuperPic(sbar_x + (132 + offset) * scale, sbar_y + 120            * scale, zymsb_crosshair_line, 36 * scale, 16 * scale, 0,1, 1,1,1,1, 0,0, 1,1,1,1, 1,1, 1,1,1,1, 1,0, 1,1,1,1, 0);
+                       DrawQ_SuperPic(sbar_x +  120           * scale, sbar_y + (132 + offset) * scale, zymsb_crosshair_line, 16 * scale, 36 * scale, 1,1, 1,1,1,1, 0,1, 1,1,1,1, 1,0, 1,1,1,1, 0,0, 1,1,1,1, 0);
+                       DrawQ_SuperPic(sbar_x + ( 88 - offset) * scale, sbar_y + 120            * scale, zymsb_crosshair_line, 36 * scale, 16 * scale, 1,0, 1,1,1,1, 1,1, 1,1,1,1, 0,0, 1,1,1,1, 0,1, 1,1,1,1, 0);
                        healthheight = cl.stats[STAT_HEALTH] * (152.0f / 300.0f);
                        shieldheight = cl.stats[STAT_ARMOR] * (152.0f / 300.0f);
                        healthstart = 204 - healthheight;
@@ -1246,13 +1226,13 @@ void Sbar_Draw (void)
                        clipstart = 190 - clipheight;
                        clipstarttc = clipstart * (1.0f / 256.0f);
                        clipendtc = (clipstart + clipheight) * (1.0f / 256.0f);
-                       if (healthheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + healthstart * scale, zymsb_crosshair_health->name, 256 * scale, healthheight * scale, 0,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 1,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 0,healthendtc, 1.0f,0.0f,0.0f,1.0f, 1,healthendtc, 1.0f,0.0f,0.0f,1.0f, DRAWFLAG_NORMAL);
-                       if (shieldheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + shieldstart * scale, zymsb_crosshair_health->name, 256 * scale, shieldheight * scale, 0,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 1,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 0,shieldendtc, 0.0f,0.5f,1.0f,1.0f, 1,shieldendtc, 0.0f,0.5f,1.0f,1.0f, DRAWFLAG_NORMAL);
-                       if (ammoheight > 0)   DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + ammostart   * scale, zymsb_crosshair_ammo->name,   256 * scale, ammoheight   * scale, 0,ammostarttc,   0.8f,0.8f,0.0f,1.0f, 1,ammostarttc,   0.8f,0.8f,0.0f,1.0f, 0,ammoendtc,   0.8f,0.8f,0.0f,1.0f, 1,ammoendtc,   0.8f,0.8f,0.0f,1.0f, DRAWFLAG_NORMAL);
-                       if (clipheight > 0)   DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + clipstart   * scale, zymsb_crosshair_clip->name,   256 * scale, clipheight   * scale, 0,clipstarttc,   1.0f,1.0f,0.0f,1.0f, 1,clipstarttc,   1.0f,1.0f,0.0f,1.0f, 0,clipendtc,   1.0f,1.0f,0.0f,1.0f, 1,clipendtc,   1.0f,1.0f,0.0f,1.0f, DRAWFLAG_NORMAL);
-                       DrawQ_Pic(sbar_x + 0 * scale, sbar_y + 0 * scale, zymsb_crosshair_background->name, 256 * scale, 256 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
-                       DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center->name, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
-       #endif
+                       if (healthheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + healthstart * scale, zymsb_crosshair_health, 256 * scale, healthheight * scale, 0,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 1,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 0,healthendtc, 1.0f,0.0f,0.0f,1.0f, 1,healthendtc, 1.0f,0.0f,0.0f,1.0f, DRAWFLAG_NORMAL);
+                       if (shieldheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + shieldstart * scale, zymsb_crosshair_health, 256 * scale, shieldheight * scale, 0,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 1,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 0,shieldendtc, 0.0f,0.5f,1.0f,1.0f, 1,shieldendtc, 0.0f,0.5f,1.0f,1.0f, DRAWFLAG_NORMAL);
+                       if (ammoheight > 0)   DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + ammostart   * scale, zymsb_crosshair_ammo,   256 * scale, ammoheight   * scale, 0,ammostarttc,   0.8f,0.8f,0.0f,1.0f, 1,ammostarttc,   0.8f,0.8f,0.0f,1.0f, 0,ammoendtc,   0.8f,0.8f,0.0f,1.0f, 1,ammoendtc,   0.8f,0.8f,0.0f,1.0f, DRAWFLAG_NORMAL);
+                       if (clipheight > 0)   DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + clipstart   * scale, zymsb_crosshair_clip,   256 * scale, clipheight   * scale, 0,clipstarttc,   1.0f,1.0f,0.0f,1.0f, 1,clipstarttc,   1.0f,1.0f,0.0f,1.0f, 0,clipendtc,   1.0f,1.0f,0.0f,1.0f, 1,clipendtc,   1.0f,1.0f,0.0f,1.0f, DRAWFLAG_NORMAL);
+                       DrawQ_Pic(sbar_x + 0 * scale, sbar_y + 0 * scale, zymsb_crosshair_background, 256 * scale, 256 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
+                       DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL);
+#endif
                }
                else // Quake and others
                {
@@ -1378,7 +1358,7 @@ void Sbar_Draw (void)
                R_Draw2DCrosshair();
 
        if (cl_prydoncursor.integer)
-               DrawQ_Pic((cl.cmd.cursor_screen[0] + 1) * 0.5 * vid_conwidth.integer, (cl.cmd.cursor_screen[1] + 1) * 0.5 * vid_conheight.integer, va("gfx/prydoncursor%03i", cl_prydoncursor.integer), 0, 0, 1, 1, 1, 1, 0);
+               DrawQ_Pic((cl.cmd.cursor_screen[0] + 1) * 0.5 * vid_conwidth.integer, (cl.cmd.cursor_screen[1] + 1) * 0.5 * vid_conheight.integer, Draw_CachePic(va("gfx/prydoncursor%03i", cl_prydoncursor.integer), false), 0, 0, 1, 1, 1, 1, 0);
 }
 
 //=============================================================================
@@ -1398,9 +1378,9 @@ float Sbar_PrintScoreboardItem(scoreboard_t *s, float x, float y)
                minutes = (int)((cl.intermission ? cl.completed_time - s->qw_entertime : realtime - s->qw_entertime) / 60.0);
                // draw colors behind score
                c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8];
-               DrawQ_Fill(x + 14*8, y+1, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic(x + 14*8, y+1, NULL, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8];
-               DrawQ_Fill(x + 14*8, y+4, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic(x + 14*8, y+4, NULL, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                // print the text
                //DrawQ_String(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
                DrawQ_ColoredString(x, y, va("%c%4i %2i %4i %4i %-4s %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), minutes,(int) s->frags, cl.qw_teamplay ? s->qw_team : "", s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL );
@@ -1409,9 +1389,9 @@ float Sbar_PrintScoreboardItem(scoreboard_t *s, float x, float y)
        {
                // draw colors behind score
                c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8];
-               DrawQ_Fill(x + 1*8, y+1, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic(x + 1*8, y+1, NULL, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8];
-               DrawQ_Fill(x + 1*8, y+4, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
+               DrawQ_Pic(x + 1*8, y+4, NULL, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0);
                // print the text
                //DrawQ_String(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
                DrawQ_ColoredString(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL );
@@ -1436,7 +1416,7 @@ void Sbar_DeathmatchOverlay (void)
        }
 
        pic = Draw_CachePic ("gfx/ranking", true);
-       DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, 8, "gfx/ranking", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
+       DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, 8, pic, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
 
        // scores
        Sbar_SortFrags ();
@@ -1524,8 +1504,8 @@ void Sbar_IntermissionOverlay (void)
        sbar_x = (vid_conwidth.integer - 320) >> 1;
        sbar_y = (vid_conheight.integer - 200) >> 1;
 
-       DrawQ_Pic (sbar_x + 64, sbar_y + 24, "gfx/complete", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
-       DrawQ_Pic (sbar_x + 0, sbar_y + 56, "gfx/inter", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
+       DrawQ_Pic (sbar_x + 64, sbar_y + 24, Draw_CachePic("gfx/complete", false), 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
+       DrawQ_Pic (sbar_x + 0, sbar_y + 56, Draw_CachePic("gfx/inter", false), 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
 
 // time
        dig = cl.completed_time/60;
@@ -1560,6 +1540,6 @@ void Sbar_FinaleOverlay (void)
        cachepic_t      *pic;
 
        pic = Draw_CachePic ("gfx/finale", true);
-       DrawQ_Pic((vid_conwidth.integer - pic->width)/2, 16, "gfx/finale", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
+       DrawQ_Pic((vid_conwidth.integer - pic->width)/2, 16, pic, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
 }