]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_draw.c
demo recording: stuff csprogs.dat files into .dem files so demos can always be played...
[xonotic/darkplaces.git] / gl_draw.c
index b1bda354f4ee203b6b4e210e541e7eea16d51e6c..655b31f4cbe7966c54e03ad4d500dc0ff55ba476 100644 (file)
--- a/gl_draw.c
+++ b/gl_draw.c
@@ -29,7 +29,7 @@ dp_font_t dp_fonts[MAX_FONTS] = {{0}};
 
 cvar_t r_textshadow = {CVAR_SAVE, "r_textshadow", "0", "draws a shadow on all text to improve readability (note: value controls offset, 1 = 1 pixel, 1.5 = 1.5 pixels, etc)"};
 cvar_t r_textbrightness = {CVAR_SAVE, "r_textbrightness", "0", "additional brightness for text color codes (0 keeps colors as is, 1 makes them all white)"};
-cvar_t r_textcontrast = {CVAR_SAVE, "r_textcontrast", "1", "additional contrast for text color codes (1 keeps colors as is, 1 makes them all black)"};
+cvar_t r_textcontrast = {CVAR_SAVE, "r_textcontrast", "1", "additional contrast for text color codes (1 keeps colors as is, 0 makes them all black)"};
 
 extern cvar_t v_glslgamma;
 
@@ -601,7 +601,7 @@ extern int con_linewidth; // to force rewrapping
 static void LoadFont(qboolean override, const char *name, dp_font_t *fnt)
 {
        int i;
-       float maxwidth;
+       float maxwidth, scale;
        char widthfile[MAX_QPATH];
        char *widthbuf;
        fs_offset_t widthbufsize;
@@ -624,6 +624,7 @@ static void LoadFont(qboolean override, const char *name, dp_font_t *fnt)
        // unspecified width == 1 (base width)
        for(i = 1; i < 256; ++i)
                fnt->width_of[i] = 1;
+       scale = 1;
 
        // FIXME load "name.width", if it fails, fill all with 1
        if((widthbuf = (char *) FS_LoadFile(widthfile, tempmempool, true, &widthbufsize)))
@@ -637,14 +638,44 @@ static void LoadFont(qboolean override, const char *name, dp_font_t *fnt)
                        if(!COM_ParseToken_Simple(&p, false, false))
                                return;
 
-                       if(!strcmp(com_token, "extraspacing"))
+                       switch(*com_token)
                        {
-                               if(!COM_ParseToken_Simple(&p, false, false))
-                                       return;
-                               extraspacing = atof(com_token);
+                               case '0':
+                               case '1':
+                               case '2':
+                               case '3':
+                               case '4':
+                               case '5':
+                               case '6':
+                               case '7':
+                               case '8':
+                               case '9':
+                               case '+':
+                               case '-':
+                               case '.':
+                                       fnt->width_of[ch++] = atof(com_token) + extraspacing;
+                                       break;
+                               default:
+                                       if(!strcmp(com_token, "extraspacing"))
+                                       {
+                                               if(!COM_ParseToken_Simple(&p, false, false))
+                                                       return;
+                                               extraspacing = atof(com_token);
+                                       }
+                                       else if(!strcmp(com_token, "scale"))
+                                       {
+                                               if(!COM_ParseToken_Simple(&p, false, false))
+                                                       return;
+                                               scale = atof(com_token);
+                                       }
+                                       else
+                                       {
+                                               Con_Printf("Warning: skipped unknown font property %s\n", com_token);
+                                               if(!COM_ParseToken_Simple(&p, false, false))
+                                                       return;
+                                       }
+                                       break;
                        }
-                       else
-                               fnt->width_of[ch++] = atof(com_token) + extraspacing;
                }
 
                Mem_Free(widthbuf);
@@ -653,7 +684,11 @@ static void LoadFont(qboolean override, const char *name, dp_font_t *fnt)
        maxwidth = fnt->width_of[1];
        for(i = 2; i < 256; ++i)
                maxwidth = max(maxwidth, fnt->width_of[i]);
-       fnt->width_of[0] = maxwidth;
+       fnt->maxwidth = maxwidth;
+
+       // fix up maxwidth for overlap
+       fnt->maxwidth *= scale;
+       fnt->scale = scale;
 
        if(fnt == FONT_CONSOLE)
                con_linewidth = -1; // rewrap console in next frame
@@ -827,7 +862,7 @@ void DrawQ_Pic(float x, float y, cachepic_t *pic, float width, float height, flo
        floats[3] = floats[6] = x + width;
        floats[7] = floats[10] = y + height;
 
-       R_Mesh_Draw(0, 4, 2, polygonelements, 0, 0);
+       R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
 }
 
 void DrawQ_Fill(float x, float y, float width, float height, float red, float green, float blue, float alpha, int flags)
@@ -848,7 +883,7 @@ void DrawQ_Fill(float x, float y, float width, float height, float red, float gr
        floats[3] = floats[6] = x + width;
        floats[7] = floats[10] = y + height;
 
-       R_Mesh_Draw(0, 4, 2, polygonelements, 0, 0);
+       R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
 }
 
 // color tag printing
@@ -908,6 +943,8 @@ float DrawQ_TextWidth_Font_UntilWidth_TrackColors(const char *text, size_t *maxl
        else
                colorindex = *outcolor;
 
+       maxwidth /= fnt->scale;
+
        for (i = 0;i < *maxlen && text[i];i++)
        {
                if (text[i] == ' ')
@@ -941,7 +978,7 @@ float DrawQ_TextWidth_Font_UntilWidth_TrackColors(const char *text, size_t *maxl
        if (outcolor)
                *outcolor = colorindex;
 
-       return x;
+       return x * fnt->scale;
 }
 
 float DrawQ_String_Font(float startx, float starty, const char *text, size_t maxlen, float w, float h, float basered, float basegreen, float baseblue, float basealpha, int flags, int *outcolor, qboolean ignorecolorcodes, const dp_font_t *fnt)
@@ -960,6 +997,10 @@ float DrawQ_String_Font(float startx, float starty, const char *text, size_t max
        tw = R_TextureWidth(fnt->tex);
        th = R_TextureHeight(fnt->tex);
 
+       starty -= (fnt->scale - 1) * h * 0.5; // center
+       w *= fnt->scale;
+       h *= fnt->scale;
+
        if (maxlen < 1)
                maxlen = 1<<30;
 
@@ -1039,7 +1080,7 @@ float DrawQ_String_Font(float startx, float starty, const char *text, size_t max
                        if (batchcount >= QUADELEMENTS_MAXQUADS)
                        {
                                GL_LockArrays(0, batchcount * 4);
-                               R_Mesh_Draw(0, batchcount * 4, batchcount * 2, quadelements, 0, 0);
+                               R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, NULL, quadelements, 0, 0);
                                GL_LockArrays(0, 0);
                                batchcount = 0;
                                ac = color4f;
@@ -1052,7 +1093,7 @@ float DrawQ_String_Font(float startx, float starty, const char *text, size_t max
        if (batchcount > 0)
        {
                GL_LockArrays(0, batchcount * 4);
-               R_Mesh_Draw(0, batchcount * 4, batchcount * 2, quadelements, 0, 0);
+               R_Mesh_Draw(0, batchcount * 4, 0, batchcount * 2, NULL, quadelements, 0, 0);
                GL_LockArrays(0, 0);
        }
 
@@ -1151,7 +1192,7 @@ void DrawQ_SuperPic(float x, float y, cachepic_t *pic, float width, float height
        floats[28] = r4;floats[29] = g4;floats[30] = b4;floats[31] = a4;
        floats[32] = r3;floats[33] = g3;floats[34] = b3;floats[35] = a3;
 
-       R_Mesh_Draw(0, 4, 2, polygonelements, 0, 0);
+       R_Mesh_Draw(0, 4, 0, 2, NULL, polygonelements, 0, 0);
 }
 
 void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
@@ -1166,7 +1207,7 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
        R_SetupGenericShader(mesh->texture != NULL);
 
        GL_LockArrays(0, mesh->num_vertices);
-       R_Mesh_Draw(0, mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, 0, 0);
+       R_Mesh_Draw(0, mesh->num_vertices, 0, mesh->num_triangles, NULL, mesh->data_element3s, 0, 0);
        GL_LockArrays(0, 0);
 }
 
@@ -1194,6 +1235,8 @@ void DrawQ_Line (float width, float x1, float y1, float x2, float y2, float r, f
 {
        _DrawQ_ProcessDrawFlag(flags);
 
+       R_SetupGenericShader(false);
+
        CHECKGLERROR
        qglLineWidth(width);CHECKGLERROR
 
@@ -1257,7 +1300,7 @@ void R_DrawGamma(void)
                        while (c[0] >= 1.01f || c[1] >= 1.01f || c[2] >= 1.01f)
                        {
                                GL_Color(bound(0, c[0] - 1, 1), bound(0, c[1] - 1, 1), bound(0, c[2] - 1, 1), 1);
-                               R_Mesh_Draw(0, 3, 1, polygonelements, 0, 0);
+                               R_Mesh_Draw(0, 3, 0, 1, NULL, polygonelements, 0, 0);
                                VectorScale(c, 0.5, c);
                        }
                }
@@ -1273,7 +1316,7 @@ void R_DrawGamma(void)
                {
                        GL_BlendFunc(GL_ONE, GL_ONE);
                        GL_Color(c[0], c[1], c[2], 1);
-                       R_Mesh_Draw(0, 3, 1, polygonelements, 0, 0);
+                       R_Mesh_Draw(0, 3, 0, 1, NULL, polygonelements, 0, 0);
                }
        }
 }