nuclear@7: #include nuclear@7: #include nuclear@7: #include "goatkit/goatkit.h" nuclear@7: #include "opengl.h" nuclear@7: #include "drawtext.h" nuclear@7: #include "sdr.h" nuclear@7: nuclear@7: #define VIS_THRES 0.005 nuclear@7: nuclear@7: using namespace goatkit; nuclear@7: nuclear@7: extern int view_xsz, view_ysz; nuclear@7: extern unsigned int prog_ui, prog_font; nuclear@7: extern struct dtx_font *font; nuclear@7: nuclear@7: static void draw_label(const Widget *w); nuclear@7: static void draw_text(float x, float y, const char *text); nuclear@7: nuclear@7: static struct { nuclear@7: const char *name; nuclear@7: WidgetDrawFunc func; nuclear@7: } widget_funcs[] = { nuclear@7: { "label", draw_label }, nuclear@7: {0, 0} nuclear@7: }; nuclear@7: nuclear@7: static std::map funcmap; nuclear@7: nuclear@7: extern "C" WidgetDrawFunc get_widget_func(const char *name) nuclear@7: { nuclear@7: static bool initialized; nuclear@7: nuclear@7: if(!initialized) { nuclear@7: for(int i=0; widget_funcs[i].func; i++) { nuclear@7: funcmap[widget_funcs[i].name] = widget_funcs[i].func; nuclear@7: } nuclear@7: initialized = true; nuclear@7: } nuclear@7: return funcmap[name]; nuclear@7: } nuclear@7: nuclear@7: static void begin_drawing(const Widget *w) nuclear@7: { nuclear@7: Vec2 pos = w->get_position(); nuclear@7: nuclear@7: glEnable(GL_BLEND); nuclear@7: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@7: nuclear@7: gl_matrix_mode(GL_MODELVIEW); nuclear@7: gl_push_matrix(); nuclear@7: gl_load_identity(); nuclear@7: gl_translatef(pos.x, pos.y, 0); nuclear@7: } nuclear@7: nuclear@7: static void end_drawing(const Widget *w) nuclear@7: { nuclear@7: gl_matrix_mode(GL_MODELVIEW); nuclear@7: gl_pop_matrix(); nuclear@7: } nuclear@7: nuclear@7: static void draw_label(const Widget *w) nuclear@7: { nuclear@7: Vec2 pos = w->get_position(); nuclear@7: float vis = w->get_visibility(); nuclear@7: if(vis < VIS_THRES) return; nuclear@7: nuclear@7: begin_drawing(w); nuclear@7: draw_text(pos.x, pos.y, w->get_text()); nuclear@7: end_drawing(w); nuclear@7: } nuclear@7: nuclear@7: static void draw_text(float x, float y, const char *text) nuclear@7: { nuclear@7: struct dtx_glyphmap *gmap = dtx_get_font_glyphmap_idx(font, 0); nuclear@7: dtx_use_font(font, dtx_get_glyphmap_ptsize(gmap)); nuclear@7: nuclear@7: float aspect = (float)view_xsz / (float)view_ysz; nuclear@7: float virt_xsz = 420.0 * aspect; nuclear@7: float virt_ysz = 420.0; nuclear@7: nuclear@7: gl_matrix_mode(GL_PROJECTION); nuclear@7: gl_push_matrix(); nuclear@7: gl_load_identity(); nuclear@7: gl_ortho(0, virt_xsz, 0, virt_ysz, -1, 1); nuclear@7: nuclear@7: gl_matrix_mode(GL_MODELVIEW); nuclear@7: gl_push_matrix(); nuclear@7: gl_load_identity(); nuclear@7: gl_translatef(x * virt_xsz, y * virt_ysz, 0); nuclear@7: nuclear@7: bind_program(prog_font); nuclear@7: set_uniform_float4(prog_font, "ucolor", 1.0, 1.0, 1.0, 1.0); nuclear@7: gl_apply_xform(prog_ui); nuclear@7: nuclear@7: dtx_string(text); nuclear@7: nuclear@7: gl_matrix_mode(GL_PROJECTION); nuclear@7: gl_pop_matrix(); nuclear@7: gl_matrix_mode(GL_MODELVIEW); nuclear@7: gl_pop_matrix(); nuclear@7: }