distance field fonts and bevel test in the font shader
[vrfileman] / src / fs.cc
index d6b5eeb..57f5170 100644 (file)
--- a/src/fs.cc
+++ b/src/fs.cc
@@ -14,6 +14,7 @@
 #include "opengl.h"
 #include "app.h"
 #include "drawtext.h"
+#include "sdr.h"
 
 static IconRenderer *iconrend;
 
@@ -23,6 +24,7 @@ static int start_child;
 
 static dtx_font *fat_font;
 #define FAT_FONT_SZ    32
+static unsigned int font_sdr;
 
 
 bool init_fs(const char *path)
@@ -32,10 +34,25 @@ bool init_fs(const char *path)
                return false;
        }
 
-       if(!(fat_font = dtx_open_font("data/fat.font", FAT_FONT_SZ))) {
-               fprintf(stderr, "failed to open font file data/fat.font\n");
+       if(!(fat_font = dtx_open_font_glyphmap("data/fat.glyphmap")) ||
+                       dtx_get_glyphmap_ptsize(dtx_get_glyphmap(fat_font, 0)) != FAT_FONT_SZ) {
+
+               dtx_set(DTX_PADDING, 64);
+
+               if(!(fat_font = dtx_open_font("data/fat.font", 0))) {
+                       fprintf(stderr, "failed to open font file data/fat.font\n");
+                       return false;
+               }
+               dtx_prepare_range(fat_font, FAT_FONT_SZ * 8, 32, 127);
+               dtx_calc_font_distfield(fat_font, 1, 8);
+               dtx_save_glyphmap("data/fat.glyphmap", dtx_get_glyphmap(fat_font, 0));
+               dtx_use_font(fat_font, FAT_FONT_SZ);
+       }
+
+       if(!(font_sdr = create_program_load("sdr/dfont.v.glsl", "sdr/dfont.p.glsl"))) {
                return false;
        }
+       set_uniform_float(font_sdr, "smoothness", 0.01);
 
        if(!(cur_node = get_fsnode(path))) {
                return false;
@@ -87,7 +104,6 @@ void draw_fs()
        base_xform.rotate(0, 0, time_sec * 0.5);
        base_xform.translate(0, 1.65, 0);
 
-       glUseProgram(0);
        glDisable(GL_TEXTURE_2D);
 
        int nchildren = (int)cur_node->children.size();
@@ -104,6 +120,8 @@ void draw_fs()
                        continue;
                }
 
+               glUseProgram(0);
+
                float angle = icon_angle(col, ncols, max_icon_angle);
 
                Mat4 xform = base_xform;
@@ -123,6 +141,7 @@ void draw_fs()
                xform.rotate_y(angle);
                glMultMatrixf(xform[0]);
 
+               glUseProgram(font_sdr);
                dtx_string(node->path.get_name());
                glPopMatrix();