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@7
|
14 extern unsigned int prog_ui, prog_font;
|
nuclear@7
|
15 extern struct dtx_font *font;
|
nuclear@7
|
16
|
nuclear@7
|
17 static void draw_label(const Widget *w);
|
nuclear@7
|
18 static void draw_text(float x, float y, const char *text);
|
nuclear@7
|
19
|
nuclear@7
|
20 static struct {
|
nuclear@7
|
21 const char *name;
|
nuclear@7
|
22 WidgetDrawFunc func;
|
nuclear@7
|
23 } widget_funcs[] = {
|
nuclear@7
|
24 { "label", draw_label },
|
nuclear@7
|
25 {0, 0}
|
nuclear@7
|
26 };
|
nuclear@7
|
27
|
nuclear@7
|
28 static std::map<std::string, WidgetDrawFunc> funcmap;
|
nuclear@7
|
29
|
nuclear@9
|
30
|
nuclear@9
|
31 extern "C"// __attribute__ ((used))
|
nuclear@9
|
32 WidgetDrawFunc get_widget_func(const char *name)
|
nuclear@7
|
33 {
|
nuclear@7
|
34 static bool initialized;
|
nuclear@7
|
35
|
nuclear@7
|
36 if(!initialized) {
|
nuclear@7
|
37 for(int i=0; widget_funcs[i].func; i++) {
|
nuclear@7
|
38 funcmap[widget_funcs[i].name] = widget_funcs[i].func;
|
nuclear@7
|
39 }
|
nuclear@7
|
40 initialized = true;
|
nuclear@7
|
41 }
|
nuclear@7
|
42 return funcmap[name];
|
nuclear@7
|
43 }
|
nuclear@7
|
44
|
nuclear@11
|
45 // register ourselves as a built-in theme
|
nuclear@11
|
46 GOATKIT_BUILTIN_THEME("istereo", get_widget_func);
|
nuclear@11
|
47
|
nuclear@7
|
48 static void begin_drawing(const Widget *w)
|
nuclear@7
|
49 {
|
nuclear@7
|
50 Vec2 pos = w->get_position();
|
nuclear@7
|
51
|
nuclear@7
|
52 glEnable(GL_BLEND);
|
nuclear@7
|
53 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
nuclear@7
|
54
|
nuclear@7
|
55 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
56 gl_push_matrix();
|
nuclear@7
|
57 gl_load_identity();
|
nuclear@7
|
58 gl_translatef(pos.x, pos.y, 0);
|
nuclear@7
|
59 }
|
nuclear@7
|
60
|
nuclear@7
|
61 static void end_drawing(const Widget *w)
|
nuclear@7
|
62 {
|
nuclear@7
|
63 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
64 gl_pop_matrix();
|
nuclear@7
|
65 }
|
nuclear@7
|
66
|
nuclear@7
|
67 static void draw_label(const Widget *w)
|
nuclear@7
|
68 {
|
nuclear@7
|
69 Vec2 pos = w->get_position();
|
nuclear@7
|
70 float vis = w->get_visibility();
|
nuclear@7
|
71 if(vis < VIS_THRES) return;
|
nuclear@7
|
72
|
nuclear@7
|
73 begin_drawing(w);
|
nuclear@7
|
74 draw_text(pos.x, pos.y, w->get_text());
|
nuclear@7
|
75 end_drawing(w);
|
nuclear@7
|
76 }
|
nuclear@7
|
77
|
nuclear@7
|
78 static void draw_text(float x, float y, const char *text)
|
nuclear@7
|
79 {
|
nuclear@7
|
80 struct dtx_glyphmap *gmap = dtx_get_font_glyphmap_idx(font, 0);
|
nuclear@7
|
81 dtx_use_font(font, dtx_get_glyphmap_ptsize(gmap));
|
nuclear@7
|
82
|
nuclear@7
|
83 float aspect = (float)view_xsz / (float)view_ysz;
|
nuclear@7
|
84 float virt_xsz = 420.0 * aspect;
|
nuclear@7
|
85 float virt_ysz = 420.0;
|
nuclear@7
|
86
|
nuclear@7
|
87 gl_matrix_mode(GL_PROJECTION);
|
nuclear@7
|
88 gl_push_matrix();
|
nuclear@7
|
89 gl_load_identity();
|
nuclear@7
|
90 gl_ortho(0, virt_xsz, 0, virt_ysz, -1, 1);
|
nuclear@7
|
91
|
nuclear@7
|
92 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
93 gl_push_matrix();
|
nuclear@7
|
94 gl_load_identity();
|
nuclear@7
|
95 gl_translatef(x * virt_xsz, y * virt_ysz, 0);
|
nuclear@7
|
96
|
nuclear@7
|
97 bind_program(prog_font);
|
nuclear@7
|
98 set_uniform_float4(prog_font, "ucolor", 1.0, 1.0, 1.0, 1.0);
|
nuclear@7
|
99 gl_apply_xform(prog_ui);
|
nuclear@7
|
100
|
nuclear@7
|
101 dtx_string(text);
|
nuclear@7
|
102
|
nuclear@7
|
103 gl_matrix_mode(GL_PROJECTION);
|
nuclear@7
|
104 gl_pop_matrix();
|
nuclear@7
|
105 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
106 gl_pop_matrix();
|
nuclear@9
|
107 }
|