X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_draw.c;h=a1374cd3d0c0d3dbd2709059bd1a2aac275872c9;hb=0d69d44e91a3d878e74e6ae7640792bfde38fc68;hp=2c30279ca158a4f7cf3a526fed02172a4fccc71b;hpb=e335de5ed205f42e33acbc794b02fa0939ba8e42;p=xonotic%2Fdarkplaces.git diff --git a/gl_draw.c b/gl_draw.c index 2c30279c..a1374cd3 100644 --- a/gl_draw.c +++ b/gl_draw.c @@ -263,13 +263,11 @@ static rtexture_t *draw_generatecrosshair(int num) } else { - data[i][0] = 255; - data[i][1] = 255; - data[i][2] = 255; - data[i][3] = (unsigned char) ((int) (in[i] - '0') * 255 / 7); + data[i][0] = data[i][1] = data[i][2] = (unsigned char) ((int) (in[i] - '0') * 127 / 7 + 128); + data[i][3] = 255; } } - return R_LoadTexture2D(drawtexturepool, va("crosshair%i", num), 16, 16, &data[0][0], TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL); + return R_LoadTexture2D(drawtexturepool, va("crosshair%i", num+1), 16, 16, &data[0][0], TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL); } static rtexture_t *draw_generateditherpattern(void) @@ -304,8 +302,10 @@ cachepic_t *Draw_CachePic (const char *path, qboolean persistent) { int crc, hashkey; cachepic_t *pic; - qpic_t *p; int flags; + fs_offset_t lmpsize; + unsigned char *lmpdata; + char lmpname[MAX_QPATH]; if (!strncmp(CLVIDEOPREFIX, path, sizeof(CLVIDEOPREFIX) - 1)) { @@ -340,53 +340,93 @@ cachepic_t *Draw_CachePic (const char *path, qboolean persistent) if (!strcmp(path, "gfx/colorcontrol/ditherpattern")) flags |= TEXF_CLAMP; - // load the pic from disk + // load a high quality image from disk if possible pic->tex = loadtextureimage(drawtexturepool, path, 0, 0, false, flags); if (pic->tex == NULL && !strncmp(path, "gfx/", 4)) { - // compatibility with older versions + // compatibility with older versions which did not require gfx/ prefix pic->tex = loadtextureimage(drawtexturepool, path + 4, 0, 0, false, flags); - // failed to find gfx/whatever.tga or similar, try the wad - if (pic->tex == NULL && (p = (qpic_t *)W_GetLumpName (path + 4))) + } + // if a high quality image was loaded, set the pic's size to match it, just + // in case there's no low quality version to get the size from + if (pic->tex) + { + pic->width = R_TextureWidth(pic->tex); + pic->height = R_TextureHeight(pic->tex); + } + + // now read the low quality version (wad or lmp file), and take the pic + // size from that even if we don't upload the texture, this way the pics + // show up the right size in the menu even if they were replaced with + // higher or lower resolution versions + dpsnprintf(lmpname, sizeof(lmpname), "%s.lmp", path); + if (!strncmp(path, "gfx/", 4) && (lmpdata = FS_LoadFile(lmpname, tempmempool, false, &lmpsize))) + { + if (lmpsize >= 9) { - if (!strcmp(path, "gfx/conchars")) - { - // conchars is a raw image and with color 0 as transparent instead of 255 - pic->tex = R_LoadTexture2D(drawtexturepool, path, 128, 128, (unsigned char *)p, TEXTYPE_PALETTE, flags, palette_font); - } - else - pic->tex = R_LoadTexture2D(drawtexturepool, path, p->width, p->height, p->data, TEXTYPE_PALETTE, flags, palette_transparent); + pic->width = lmpdata[0] + lmpdata[1] * 256 + lmpdata[2] * 65536 + lmpdata[3] * 16777216; + pic->height = lmpdata[4] + lmpdata[5] * 256 + lmpdata[6] * 65536 + lmpdata[7] * 16777216; + // if no high quality replacement image was found, upload the original low quality texture + if (!pic->tex) + pic->tex = R_LoadTexture2D(drawtexturepool, path, pic->width, pic->height, lmpdata + 8, TEXTYPE_PALETTE, flags, palette_transparent); + } + Mem_Free(lmpdata); + } + else if ((lmpdata = W_GetLumpName (path + 4))) + { + if (!strcmp(path, "gfx/conchars")) + { + // conchars is a raw image and with color 0 as transparent instead of 255 + pic->width = 128; + pic->height = 128; + // if no high quality replacement image was found, upload the original low quality texture + if (!pic->tex) + pic->tex = R_LoadTexture2D(drawtexturepool, path, 128, 128, lmpdata, TEXTYPE_PALETTE, flags, palette_font); + } + else + { + pic->width = lmpdata[0] + lmpdata[1] * 256 + lmpdata[2] * 65536 + lmpdata[3] * 16777216; + pic->height = lmpdata[4] + lmpdata[5] * 256 + lmpdata[6] * 65536 + lmpdata[7] * 16777216; + // if no high quality replacement image was found, upload the original low quality texture + if (!pic->tex) + pic->tex = R_LoadTexture2D(drawtexturepool, path, pic->width, pic->height, lmpdata + 8, TEXTYPE_PALETTE, flags, palette_transparent); } } - if (pic->tex == NULL && !strcmp(path, "gfx/conchars")) - pic->tex = draw_generateconchars(); - if (pic->tex == NULL && !strcmp(path, "ui/mousepointer")) - pic->tex = draw_generatemousepointer(); - if (pic->tex == NULL && !strcmp(path, "gfx/prydoncursor001")) - pic->tex = draw_generatemousepointer(); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair1")) - pic->tex = draw_generatecrosshair(0); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair2")) - pic->tex = draw_generatecrosshair(1); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair3")) - pic->tex = draw_generatecrosshair(2); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair4")) - pic->tex = draw_generatecrosshair(3); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair5")) - pic->tex = draw_generatecrosshair(4); - if (pic->tex == NULL && !strcmp(path, "gfx/crosshair6")) - pic->tex = draw_generatecrosshair(5); - if (pic->tex == NULL && !strcmp(path, "gfx/colorcontrol/ditherpattern")) - pic->tex = draw_generateditherpattern(); + // if it's not found on disk, check if it's one of the builtin images if (pic->tex == NULL) { - Con_Printf("Draw_CachePic: failed to load %s\n", path); - pic->tex = r_texture_notexture; + if (pic->tex == NULL && !strcmp(path, "gfx/conchars")) + pic->tex = draw_generateconchars(); + if (pic->tex == NULL && !strcmp(path, "ui/mousepointer")) + pic->tex = draw_generatemousepointer(); + if (pic->tex == NULL && !strcmp(path, "gfx/prydoncursor001")) + pic->tex = draw_generatemousepointer(); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair1")) + pic->tex = draw_generatecrosshair(0); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair2")) + pic->tex = draw_generatecrosshair(1); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair3")) + pic->tex = draw_generatecrosshair(2); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair4")) + pic->tex = draw_generatecrosshair(3); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair5")) + pic->tex = draw_generatecrosshair(4); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair6")) + pic->tex = draw_generatecrosshair(5); + if (pic->tex == NULL && !strcmp(path, "gfx/colorcontrol/ditherpattern")) + pic->tex = draw_generateditherpattern(); + if (pic->tex == NULL) + { + // don't complain about missing gfx/crosshair images + if (strncmp(path, "gfx/crosshair", 13)) + Con_Printf("Draw_CachePic: failed to load %s\n", path); + pic->tex = r_texture_notexture; + } + pic->width = R_TextureWidth(pic->tex); + pic->height = R_TextureHeight(pic->tex); } - pic->width = R_TextureWidth(pic->tex); - pic->height = R_TextureHeight(pic->tex); return pic; } @@ -420,7 +460,7 @@ cachepic_t *Draw_NewPic(const char *picname, int width, int height, int alpha, u return cachepics; // return the first one } pic = cachepics + (numcachepics++); - strcpy (pic->name, picname); + strlcpy (pic->name, picname, sizeof(pic->name)); // link into list pic->chain = cachepichash[hashkey]; cachepichash[hashkey] = pic; @@ -491,14 +531,18 @@ void GL_Draw_Init (void) R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap); } -void DrawQ_Begin(void) +static void _DrawQ_Setup(void) { - GL_ColorMask(r_view.colormask[0], r_view.colormask[1], r_view.colormask[2], 1); - + if (r_refdef.draw2dstage) + return; + r_refdef.draw2dstage = true; CHECKGLERROR qglViewport(r_view.x, vid.height - (r_view.y + r_view.height), r_view.width, r_view.height);CHECKGLERROR + GL_ColorMask(r_view.colormask[0], r_view.colormask[1], r_view.colormask[2], 1); GL_SetupView_Mode_Ortho(0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100); qglDepthFunc(GL_LEQUAL);CHECKGLERROR + qglDisable(GL_POLYGON_OFFSET_FILL);CHECKGLERROR + GL_CullFace(GL_FRONT); // quake is backwards, this culls back faces R_Mesh_Matrix(&identitymatrix); GL_DepthMask(true); @@ -507,11 +551,15 @@ void DrawQ_Begin(void) GL_AlphaTest(false); GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - r_refdef.draw2dstage = true; + if (gl_support_fragment_shader) + { + qglUseProgramObjectARB(0);CHECKGLERROR + } } static void _DrawQ_ProcessDrawFlag(int flags) { + _DrawQ_Setup(); CHECKGLERROR if(flags == DRAWFLAG_ADDITIVE) GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); @@ -525,11 +573,6 @@ static void _DrawQ_ProcessDrawFlag(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) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_Pic: not in 2d rendering stage!\n"); - return; - } 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); } @@ -541,12 +584,6 @@ void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float w float vertex3f[QUADELEMENTS_MAXQUADS*4*3]; float texcoord2f[QUADELEMENTS_MAXQUADS*4*2]; - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_String: not in 2d rendering stage!\n"); - return; - } - if (alpha < (1.0f / 255.0f)) return; @@ -606,12 +643,6 @@ void DrawQ_String_Real(float x, float y, const char *string, int maxlen, float w 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) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_String: not in 2d rendering stage!\n"); - return; - } - if (r_textshadow.integer) DrawQ_String_Real(x+scalex*0.25,y+scaley*0.25,string,maxlen,scalex,scaley,0,0,0,alpha*0.8,flags); @@ -656,11 +687,6 @@ void DrawQ_ColoredString( float x, float y, const char *text, int maxlen, float int colorindex; const char *start, *current; - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_ColoredString: not in 2d rendering stage!\n"); - return; - } if( !outcolor || *outcolor == -1 ) { colorindex = STRING_COLOR_DEFAULT; } else { @@ -735,12 +761,6 @@ void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height { float floats[36]; - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_SuperPic: not in 2d rendering stage!\n"); - return; - } - _DrawQ_ProcessDrawFlag(flags); R_Mesh_VertexPointer(floats); @@ -775,12 +795,6 @@ void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_Mesh: not in 2d rendering stage!\n"); - return; - } - _DrawQ_ProcessDrawFlag(flags); R_Mesh_VertexPointer(mesh->data_vertex3f); @@ -798,12 +812,6 @@ void DrawQ_LineLoop (drawqueuemesh_t *mesh, int flags) { int num; - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_LineLoop: not in 2d rendering stage!\n"); - return; - } - _DrawQ_ProcessDrawFlag(flags); GL_Color(1,1,1,1); @@ -819,32 +827,13 @@ void DrawQ_LineLoop (drawqueuemesh_t *mesh, int flags) CHECKGLERROR } -//LordHavoc: FIXME: this is nasty! -void DrawQ_LineWidth (float width) -{ - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_LineWidth: not in 2d rendering stage!\n"); - return; - } - CHECKGLERROR - qglLineWidth(width);CHECKGLERROR -} - //[515]: this is old, delete void DrawQ_Line (float width, float x1, float y1, float x2, float y2, float r, float g, float b, float alpha, int flags) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_Line: not in 2d rendering stage!\n"); - return; - } + _DrawQ_ProcessDrawFlag(flags); CHECKGLERROR - if(width > 0) - DrawQ_LineWidth(width); - - _DrawQ_ProcessDrawFlag(flags); + qglLineWidth(width);CHECKGLERROR GL_Color(r,g,b,alpha); CHECKGLERROR @@ -857,11 +846,7 @@ void DrawQ_Line (float width, float x1, float y1, float x2, float y2, float r, f void DrawQ_SetClipArea(float x, float y, float width, float height) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_SetClipArea: not in 2d rendering stage!\n"); - return; - } + _DrawQ_Setup(); // We have to convert the con coords into real coords // OGL uses top to bottom @@ -872,22 +857,12 @@ void DrawQ_SetClipArea(float x, float y, float width, float height) void DrawQ_ResetClipArea(void) { - if (!r_refdef.draw2dstage) - { - Con_Printf("DrawQ_ResetClipArea: not in 2d rendering stage!\n"); - return; - } + _DrawQ_Setup(); GL_ScissorTest(false); } void DrawQ_Finish(void) { - if (!r_refdef.draw2dstage) - { - Con_Printf("R_DrawQueue: not in 2d rendering stage!\n"); - return; - } - r_refdef.draw2dstage = false; }