istereo2

annotate src/uitheme.cc @ 13:ea928c313344

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 28 Sep 2015 19:04:50 +0300
parents 57188f7d9304
children 018f997dc646
rev   line source
nuclear@7 1 #include <map>
nuclear@7 2 #include <string>
nuclear@7 3 #include "goatkit/goatkit.h"
nuclear@7 4 #include "opengl.h"
nuclear@9 5 #include "sanegl.h"
nuclear@7 6 #include "drawtext.h"
nuclear@7 7 #include "sdr.h"
nuclear@7 8
nuclear@7 9 #define VIS_THRES 0.005
nuclear@7 10
nuclear@7 11 using namespace goatkit;
nuclear@7 12
nuclear@7 13 extern int view_xsz, view_ysz;
nuclear@13 14 extern float view_aspect;
nuclear@13 15 extern unsigned int prog_ui, prog_font, prog_color;
nuclear@7 16 extern struct dtx_font *font;
nuclear@7 17
nuclear@7 18 static void draw_label(const Widget *w);
nuclear@13 19 static void draw_button(const Widget *w);
nuclear@13 20 static void draw_rect(const Vec2 &pos, const Vec2 &sz, float r, float g, float b, float a = 1.0f);
nuclear@7 21 static void draw_text(float x, float y, const char *text);
nuclear@7 22
nuclear@7 23 static struct {
nuclear@7 24 const char *name;
nuclear@7 25 WidgetDrawFunc func;
nuclear@7 26 } widget_funcs[] = {
nuclear@7 27 { "label", draw_label },
nuclear@13 28 { "button", draw_button },
nuclear@7 29 {0, 0}
nuclear@7 30 };
nuclear@7 31
nuclear@7 32 static std::map<std::string, WidgetDrawFunc> funcmap;
nuclear@7 33
nuclear@9 34
nuclear@10 35 extern "C" __attribute__ ((used))
nuclear@9 36 WidgetDrawFunc get_widget_func(const char *name)
nuclear@7 37 {
nuclear@7 38 static bool initialized;
nuclear@7 39
nuclear@7 40 if(!initialized) {
nuclear@7 41 for(int i=0; widget_funcs[i].func; i++) {
nuclear@7 42 funcmap[widget_funcs[i].name] = widget_funcs[i].func;
nuclear@7 43 }
nuclear@7 44 initialized = true;
nuclear@7 45 }
nuclear@7 46 return funcmap[name];
nuclear@7 47 }
nuclear@7 48
nuclear@11 49 // register ourselves as a built-in theme
nuclear@11 50 GOATKIT_BUILTIN_THEME("istereo", get_widget_func);
nuclear@11 51
nuclear@7 52 static void begin_drawing(const Widget *w)
nuclear@7 53 {
nuclear@7 54 Vec2 pos = w->get_position();
nuclear@7 55
nuclear@7 56 glEnable(GL_BLEND);
nuclear@7 57 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
nuclear@7 58
nuclear@7 59 gl_matrix_mode(GL_MODELVIEW);
nuclear@7 60 gl_push_matrix();
nuclear@7 61 gl_load_identity();
nuclear@7 62 gl_translatef(pos.x, pos.y, 0);
nuclear@7 63 }
nuclear@7 64
nuclear@7 65 static void end_drawing(const Widget *w)
nuclear@7 66 {
nuclear@7 67 gl_matrix_mode(GL_MODELVIEW);
nuclear@7 68 gl_pop_matrix();
nuclear@7 69 }
nuclear@7 70
nuclear@7 71 static void draw_label(const Widget *w)
nuclear@7 72 {
nuclear@7 73 Vec2 pos = w->get_position();
nuclear@7 74 float vis = w->get_visibility();
nuclear@7 75 if(vis < VIS_THRES) return;
nuclear@7 76
nuclear@7 77 begin_drawing(w);
nuclear@7 78 draw_text(pos.x, pos.y, w->get_text());
nuclear@7 79 end_drawing(w);
nuclear@7 80 }
nuclear@7 81
nuclear@13 82 static void draw_button(const Widget *w)
nuclear@13 83 {
nuclear@13 84 Vec2 pos = w->get_position();
nuclear@13 85 Vec2 sz = w->get_size();
nuclear@13 86 float vis = w->get_visibility();
nuclear@13 87 if(vis < VIS_THRES) return;
nuclear@13 88
nuclear@13 89 begin_drawing(w);
nuclear@13 90
nuclear@13 91 draw_rect(pos, sz, 1.0, 0.3, 0.2);
nuclear@13 92 draw_text(pos.x, pos.y, w->get_text());
nuclear@13 93
nuclear@13 94 end_drawing(w);
nuclear@13 95 }
nuclear@13 96
nuclear@13 97 static void draw_rect(const Vec2 &pos, const Vec2 &sz, float r, float g, float b, float a)
nuclear@13 98 {
nuclear@13 99 float aspect = sz.x / sz.y;
nuclear@13 100
nuclear@13 101 bind_program(prog_color);
nuclear@13 102 gl_apply_xform(prog_color);
nuclear@13 103
nuclear@13 104 gl_begin(GL_QUADS);
nuclear@13 105 gl_color4f(r, g, b, a);
nuclear@13 106 gl_texcoord2f(0, 1);
nuclear@13 107 gl_vertex2f(pos.x, pos.y);
nuclear@13 108 gl_texcoord2f(aspect, 1);
nuclear@13 109 gl_vertex2f(pos.x + sz.x, pos.y);
nuclear@13 110 gl_texcoord2f(aspect, 0);
nuclear@13 111 gl_vertex2f(pos.x + sz.x, pos.y + sz.y);
nuclear@13 112 gl_texcoord2f(0, 0);
nuclear@13 113 gl_vertex2f(pos.x, pos.y + sz.y);
nuclear@13 114 gl_end();
nuclear@13 115 }
nuclear@13 116
nuclear@7 117 static void draw_text(float x, float y, const char *text)
nuclear@7 118 {
nuclear@7 119 struct dtx_glyphmap *gmap = dtx_get_font_glyphmap_idx(font, 0);
nuclear@7 120 dtx_use_font(font, dtx_get_glyphmap_ptsize(gmap));
nuclear@7 121
nuclear@13 122 float virt_xsz = 420.0 * view_aspect;
nuclear@7 123 float virt_ysz = 420.0;
nuclear@7 124
nuclear@7 125 gl_matrix_mode(GL_PROJECTION);
nuclear@7 126 gl_push_matrix();
nuclear@7 127 gl_load_identity();
nuclear@7 128 gl_ortho(0, virt_xsz, 0, virt_ysz, -1, 1);
nuclear@7 129
nuclear@7 130 gl_matrix_mode(GL_MODELVIEW);
nuclear@7 131 gl_push_matrix();
nuclear@7 132 gl_load_identity();
nuclear@7 133 gl_translatef(x * virt_xsz, y * virt_ysz, 0);
nuclear@7 134
nuclear@7 135 bind_program(prog_font);
nuclear@7 136 set_uniform_float4(prog_font, "ucolor", 1.0, 1.0, 1.0, 1.0);
nuclear@7 137 gl_apply_xform(prog_ui);
nuclear@7 138
nuclear@7 139 dtx_string(text);
nuclear@7 140
nuclear@7 141 gl_matrix_mode(GL_PROJECTION);
nuclear@7 142 gl_pop_matrix();
nuclear@7 143 gl_matrix_mode(GL_MODELVIEW);
nuclear@7 144 gl_pop_matrix();
nuclear@9 145 }