]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_draw.c
bring back old glibc workaround
[xonotic/darkplaces.git] / gl_draw.c
index 148acac897fc741f4c6a8636d69544a5727c35c2..37126255d6a563a2ca4a52edfb0337224eae9086 100644 (file)
--- a/gl_draw.c
+++ b/gl_draw.c
@@ -42,6 +42,8 @@ cvar_t r_font_postprocess_shadow_y = {CVAR_SAVE, "r_font_postprocess_shadow_y",
 cvar_t r_font_postprocess_shadow_z = {CVAR_SAVE, "r_font_postprocess_shadow_z", "0", "font shadow Z shift amount, applied during blurring"};
 cvar_t r_font_hinting = {CVAR_SAVE, "r_font_hinting", "3", "0 = no hinting, 1 = light autohinting, 2 = full autohinting, 3 = full hinting"};
 cvar_t r_font_antialias = {CVAR_SAVE, "r_font_antialias", "1", "0 = monochrome, 1 = grey" /* , 2 = rgb, 3 = bgr" */};
+cvar_t r_nearest_2d = {CVAR_SAVE, "r_nearest_2d", "0", "use nearest filtering on all 2d textures (including conchars)"};
+cvar_t r_nearest_conchars = {CVAR_SAVE, "r_nearest_conchars", "0", "use nearest filtering on conchars texture"};
 
 extern cvar_t v_glslgamma;
 
@@ -109,7 +111,7 @@ static rtexture_t *draw_generateconchars(void)
        Image_WriteTGABGRA ("gfx/generated_conchars.tga", 256, 256, data);
 #endif
 
-       tex = R_LoadTexture2D(drawtexturepool, "conchars", 256, 256, data, TEXTYPE_BGRA, TEXF_ALPHA, -1, NULL);
+       tex = R_LoadTexture2D(drawtexturepool, "conchars", 256, 256, data, TEXTYPE_BGRA, TEXF_ALPHA | (r_nearest_conchars.integer ? TEXF_FORCENEAREST : 0), -1, NULL);
        Mem_Free(data);
        return tex;
 }
@@ -328,8 +330,12 @@ cachepic_t *Draw_CachePic_Flags(const char *path, unsigned int cachepicflags)
        texflags = TEXF_ALPHA;
        if (!(cachepicflags & CACHEPICFLAG_NOCLAMP))
                texflags |= TEXF_CLAMP;
+       if (cachepicflags & CACHEPICFLAG_MIPMAP)
+               texflags |= TEXF_MIPMAP;
        if (!(cachepicflags & CACHEPICFLAG_NOCOMPRESSION) && gl_texturecompression_2d.integer && gl_texturecompression.integer)
                texflags |= TEXF_COMPRESS;
+       if ((cachepicflags & CACHEPICFLAG_NEAREST) || r_nearest_2d.integer)
+               texflags |= TEXF_FORCENEAREST;
 
        // check whether the picture has already been cached
        crc = CRC_Block((unsigned char *)path, strlen(path));
@@ -341,7 +347,7 @@ cachepic_t *Draw_CachePic_Flags(const char *path, unsigned int cachepicflags)
                        // if it was created (or replaced) by Draw_NewPic, just return it
                        if(pic->flags & CACHEPICFLAG_NEWPIC)
                                return pic;
-                       if (!((pic->texflags ^ texflags) & ~(TEXF_COMPRESS))) // ignore TEXF_COMPRESS when comparing, because fallback pics remove the flag
+                       if (!((pic->texflags ^ texflags) & ~(TEXF_COMPRESS | TEXF_MIPMAP))) // ignore TEXF_COMPRESS when comparing, because fallback pics remove the flag, and ignore TEXF_MIPMAP because QC specifies that
                        {
                                if(!(cachepicflags & CACHEPICFLAG_NOTPERSISTENT))
                                {
@@ -673,20 +679,20 @@ void LoadFont(qboolean override, const char *name, dp_font_t *fnt, float scale,
                        Con_DPrintf("Failed to load font-file for '%s', it will not support as many characters.\n", fnt->texpath);
        }
 
-       fnt->tex = Draw_CachePic_Flags(fnt->texpath, CACHEPICFLAG_QUIET | CACHEPICFLAG_NOCOMPRESSION)->tex;
+       fnt->tex = Draw_CachePic_Flags(fnt->texpath, CACHEPICFLAG_QUIET | CACHEPICFLAG_NOCOMPRESSION | (r_nearest_conchars.integer ? CACHEPICFLAG_NEAREST : 0))->tex;
        if(fnt->tex == r_texture_notexture)
        {
                for (i = 0; i < MAX_FONT_FALLBACKS; ++i)
                {
                        if (!fnt->fallbacks[i][0])
                                break;
-                       fnt->tex = Draw_CachePic_Flags(fnt->fallbacks[i], CACHEPICFLAG_QUIET | CACHEPICFLAG_NOCOMPRESSION)->tex;
+                       fnt->tex = Draw_CachePic_Flags(fnt->fallbacks[i], CACHEPICFLAG_QUIET | CACHEPICFLAG_NOCOMPRESSION | (r_nearest_conchars.integer ? CACHEPICFLAG_NEAREST : 0))->tex;
                        if(fnt->tex != r_texture_notexture)
                                break;
                }
                if(fnt->tex == r_texture_notexture)
                {
-                       fnt->tex = Draw_CachePic_Flags("gfx/conchars", CACHEPICFLAG_NOCOMPRESSION)->tex;
+                       fnt->tex = Draw_CachePic_Flags("gfx/conchars", CACHEPICFLAG_NOCOMPRESSION | (r_nearest_conchars.integer ? CACHEPICFLAG_NEAREST : 0))->tex;
                        strlcpy(widthfile, "gfx/conchars.width", sizeof(widthfile));
                }
                else
@@ -1044,6 +1050,8 @@ void GL_Draw_Init (void)
        Cvar_RegisterVariable(&r_textshadow);
        Cvar_RegisterVariable(&r_textbrightness);
        Cvar_RegisterVariable(&r_textcontrast);
+       Cvar_RegisterVariable(&r_nearest_2d);
+       Cvar_RegisterVariable(&r_nearest_conchars);
 
        // allocate fonts storage
        fonts_mempool = Mem_AllocPool("FONTS", 0, NULL);
@@ -1071,37 +1079,17 @@ void GL_Draw_Init (void)
 
 static void _DrawQ_Setup(void) // see R_ResetViewRendering2D
 {
-       r_viewport_t viewport;
        if (r_refdef.draw2dstage == 1)
                return;
        r_refdef.draw2dstage = 1;
-       CHECKGLERROR
-
-       R_Viewport_InitOrtho(&viewport, &identitymatrix, r_refdef.view.x, vid.height - r_refdef.view.y - r_refdef.view.height, r_refdef.view.width, r_refdef.view.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL);
-       R_Mesh_SetRenderTargets(0, NULL, NULL, NULL, NULL, NULL);
-       R_SetViewport(&viewport);
-       //GL_Scissor(viewport.x, viewport.y, viewport.width, viewport.height); // DrawQ_SetClipArea would do this
-       GL_Color(1, 1, 1, 1);
-       GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1);
-       //GL_BlendFunc(GL_ONE, GL_ZERO); // DrawQ_ProcessDrawFlag does this
-       GL_ScissorTest(false);
-       GL_DepthMask(false);
-       GL_DepthRange(0, 1);
-       GL_DepthTest(false);
-       GL_DepthFunc(GL_LEQUAL);
-       R_EntityMatrix(&identitymatrix);
-       R_Mesh_ResetTextureState();
-       GL_PolygonOffset(0, 0);
-       //R_SetStencil(false, 255, GL_KEEP, GL_KEEP, GL_KEEP, GL_ALWAYS, 128, 255); // not needed
-       //qglEnable(GL_POLYGON_OFFSET_FILL); // we never use polygon offset here
-       GL_CullFace(GL_NONE);
+
+       R_ResetViewRendering2D_Common(0, NULL, NULL, vid_conwidth.integer, vid_conheight.integer);
 }
 
 qboolean r_draw2d_force = false;
 static void _DrawQ_SetupAndProcessDrawFlag(int flags, cachepic_t *pic, float alpha)
 {
        _DrawQ_Setup();
-       CHECKGLERROR
        if(!r_draw2d.integer && !r_draw2d_force)
                return;
        DrawQ_ProcessDrawFlag(flags, (alpha < 1) || (pic && pic->hasalpha));
@@ -1729,10 +1717,20 @@ float DrawQ_String_Scale(float startx, float starty, const char *text, size_t ma
                                //thisw = fnt->width_of[num];
                                thisw = fnt->width_of[ch];
                                // FIXME make these smaller to just include the occupied part of the character for slightly faster rendering
-                               s = (ch & 15)*0.0625f + (0.5f / tw);
-                               t = (ch >> 4)*0.0625f + (0.5f / th);
-                               u = 0.0625f * thisw - (1.0f / tw);
-                               v = 0.0625f - (1.0f / th);
+                               if (r_nearest_conchars.integer)
+                               {
+                                       s = (ch & 15)*0.0625f;
+                                       t = (ch >> 4)*0.0625f;
+                                       u = 0.0625f * thisw;
+                                       v = 0.0625f;
+                               }
+                               else
+                               {
+                                       s = (ch & 15)*0.0625f + (0.5f / tw);
+                                       t = (ch >> 4)*0.0625f + (0.5f / th);
+                                       u = 0.0625f * thisw - (1.0f / tw);
+                                       v = 0.0625f - (1.0f / th);
+                               }
                                ac[ 0] = DrawQ_Color[0];ac[ 1] = DrawQ_Color[1];ac[ 2] = DrawQ_Color[2];ac[ 3] = DrawQ_Color[3];
                                ac[ 4] = DrawQ_Color[0];ac[ 5] = DrawQ_Color[1];ac[ 6] = DrawQ_Color[2];ac[ 7] = DrawQ_Color[3];
                                ac[ 8] = DrawQ_Color[0];ac[ 9] = DrawQ_Color[1];ac[10] = DrawQ_Color[2];ac[11] = DrawQ_Color[3];
@@ -1959,7 +1957,6 @@ void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height
 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags, qboolean hasalpha)
 {
        _DrawQ_Setup();
-       CHECKGLERROR
        if(!r_draw2d.integer && !r_draw2d_force)
                return;
        DrawQ_ProcessDrawFlag(flags, hasalpha);