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 }
|