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@14
|
9 #define BEVEL 1.0
|
nuclear@7
|
10 #define VIS_THRES 0.005
|
nuclear@7
|
11
|
nuclear@7
|
12 using namespace goatkit;
|
nuclear@7
|
13
|
nuclear@14
|
14 struct Color {
|
nuclear@14
|
15 float r, g, b, a;
|
nuclear@14
|
16
|
nuclear@14
|
17 Color() : r(1), g(1), b(1), a(1) {}
|
nuclear@14
|
18 Color(float r, float g, float b, float a = 1.0f)
|
nuclear@14
|
19 {
|
nuclear@14
|
20 this->r = r;
|
nuclear@14
|
21 this->g = g;
|
nuclear@14
|
22 this->b = b;
|
nuclear@14
|
23 this->a = a;
|
nuclear@14
|
24 }
|
nuclear@14
|
25 };
|
nuclear@14
|
26
|
nuclear@14
|
27 enum {
|
nuclear@14
|
28 TEXT_COLOR,
|
nuclear@14
|
29 TOP_COLOR,
|
nuclear@14
|
30 BOTTOM_COLOR,
|
nuclear@14
|
31 BEVEL_LIT_COLOR,
|
nuclear@14
|
32 BEVEL_SHAD_COLOR,
|
nuclear@14
|
33 CURSOR_COLOR,
|
nuclear@14
|
34 SELECTION_COLOR,
|
nuclear@14
|
35 CHECK_COLOR
|
nuclear@14
|
36 };
|
nuclear@14
|
37
|
nuclear@14
|
38 static Color colors[] = {
|
nuclear@14
|
39 Color(0.0, 0.0, 0.0, 1.0), /* text color */
|
nuclear@14
|
40 Color(0.75, 0.75, 0.75, 1.0), /* top color */
|
nuclear@14
|
41 Color(0.56, 0.56, 0.56, 1.0), /* bot color */
|
nuclear@14
|
42 Color(0.8, 0.8, 0.8, 1.0), /* lit bevel */
|
nuclear@14
|
43 Color(0.35, 0.35, 0.35, 1.0), /* shadowed bevel */
|
nuclear@14
|
44 Color(0.8, 0.25, 0.18, 1.0), /* cursor color */
|
nuclear@14
|
45 Color(0.68, 0.85, 1.3, 1.0), /* selection color */
|
nuclear@14
|
46 Color(0.75, 0.1, 0.095, 1.0) /* check color */
|
nuclear@14
|
47 };
|
nuclear@14
|
48
|
nuclear@14
|
49
|
nuclear@14
|
50 #define JLEFT -1.0f
|
nuclear@14
|
51 #define JCENTER 0.0f
|
nuclear@14
|
52 #define JRIGHT 1.0f
|
nuclear@14
|
53
|
nuclear@14
|
54 enum { FRAME_INSET, FRAME_OUTSET };
|
nuclear@14
|
55
|
nuclear@7
|
56 extern int view_xsz, view_ysz;
|
nuclear@13
|
57 extern float view_aspect;
|
nuclear@13
|
58 extern unsigned int prog_ui, prog_font, prog_color;
|
nuclear@7
|
59 extern struct dtx_font *font;
|
nuclear@7
|
60
|
nuclear@7
|
61 static void draw_label(const Widget *w);
|
nuclear@13
|
62 static void draw_button(const Widget *w);
|
nuclear@14
|
63 static void draw_rect(const Vec2 &pos, const Vec2 &sz, const Color &color);
|
nuclear@14
|
64 static void draw_rect(const Vec2 &pos, const Vec2 &sz, const Color &ctop, const Color &cbot);
|
nuclear@14
|
65 static void draw_text(float justify, float x, float y, const char *text);
|
nuclear@14
|
66 static void draw_frame(const Vec2 &pos, const Vec2 &sz, float inset);
|
nuclear@14
|
67 static Color lerp(const Color &a, const Color &b, float t);
|
nuclear@7
|
68
|
nuclear@7
|
69 static struct {
|
nuclear@7
|
70 const char *name;
|
nuclear@7
|
71 WidgetDrawFunc func;
|
nuclear@7
|
72 } widget_funcs[] = {
|
nuclear@7
|
73 { "label", draw_label },
|
nuclear@13
|
74 { "button", draw_button },
|
nuclear@7
|
75 {0, 0}
|
nuclear@7
|
76 };
|
nuclear@7
|
77
|
nuclear@7
|
78 static std::map<std::string, WidgetDrawFunc> funcmap;
|
nuclear@7
|
79
|
nuclear@9
|
80
|
nuclear@10
|
81 extern "C" __attribute__ ((used))
|
nuclear@9
|
82 WidgetDrawFunc get_widget_func(const char *name)
|
nuclear@7
|
83 {
|
nuclear@7
|
84 static bool initialized;
|
nuclear@7
|
85
|
nuclear@7
|
86 if(!initialized) {
|
nuclear@7
|
87 for(int i=0; widget_funcs[i].func; i++) {
|
nuclear@7
|
88 funcmap[widget_funcs[i].name] = widget_funcs[i].func;
|
nuclear@7
|
89 }
|
nuclear@7
|
90 initialized = true;
|
nuclear@7
|
91 }
|
nuclear@7
|
92 return funcmap[name];
|
nuclear@7
|
93 }
|
nuclear@7
|
94
|
nuclear@11
|
95 // register ourselves as a built-in theme
|
nuclear@11
|
96 GOATKIT_BUILTIN_THEME("istereo", get_widget_func);
|
nuclear@11
|
97
|
nuclear@7
|
98 static void begin_drawing(const Widget *w)
|
nuclear@7
|
99 {
|
nuclear@14
|
100 //Vec2 pos = w->get_position();
|
nuclear@7
|
101
|
nuclear@7
|
102 glEnable(GL_BLEND);
|
nuclear@7
|
103 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
nuclear@7
|
104
|
nuclear@7
|
105 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
106 gl_push_matrix();
|
nuclear@7
|
107 gl_load_identity();
|
nuclear@14
|
108 //gl_translatef(pos.x, pos.y, 0);
|
nuclear@7
|
109 }
|
nuclear@7
|
110
|
nuclear@7
|
111 static void end_drawing(const Widget *w)
|
nuclear@7
|
112 {
|
nuclear@7
|
113 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
114 gl_pop_matrix();
|
nuclear@7
|
115 }
|
nuclear@7
|
116
|
nuclear@7
|
117 static void draw_label(const Widget *w)
|
nuclear@7
|
118 {
|
nuclear@7
|
119 Vec2 pos = w->get_position();
|
nuclear@7
|
120 float vis = w->get_visibility();
|
nuclear@7
|
121 if(vis < VIS_THRES) return;
|
nuclear@7
|
122
|
nuclear@7
|
123 begin_drawing(w);
|
nuclear@14
|
124 draw_text(JLEFT, pos.x, pos.y, w->get_text());
|
nuclear@7
|
125 end_drawing(w);
|
nuclear@7
|
126 }
|
nuclear@7
|
127
|
nuclear@13
|
128 static void draw_button(const Widget *w)
|
nuclear@13
|
129 {
|
nuclear@13
|
130 Vec2 pos = w->get_position();
|
nuclear@13
|
131 Vec2 sz = w->get_size();
|
nuclear@13
|
132 float vis = w->get_visibility();
|
nuclear@14
|
133 float press = w->get_pressed();
|
nuclear@13
|
134 if(vis < VIS_THRES) return;
|
nuclear@13
|
135
|
nuclear@14
|
136 Color tcol = lerp(colors[TOP_COLOR], colors[BOTTOM_COLOR], press);
|
nuclear@14
|
137 Color bcol = lerp(colors[BOTTOM_COLOR], colors[TOP_COLOR], press);
|
nuclear@14
|
138
|
nuclear@13
|
139 begin_drawing(w);
|
nuclear@13
|
140
|
nuclear@14
|
141 draw_frame(pos, sz, press);
|
nuclear@14
|
142 draw_rect(pos, sz, tcol, bcol);
|
nuclear@14
|
143 //draw_rect(Vec2(pos.x + sz.x / 2.0 - 2.0, pos.y), Vec2(4.0, sz.y),
|
nuclear@14
|
144 // Color(0.4, 0.5, 1.0));
|
nuclear@14
|
145 draw_text(JCENTER, pos.x + sz.x / 2.0, pos.y, w->get_text());
|
nuclear@13
|
146
|
nuclear@13
|
147 end_drawing(w);
|
nuclear@13
|
148 }
|
nuclear@13
|
149
|
nuclear@14
|
150 static void draw_rect(const Vec2 &pos, const Vec2 &sz, const Color &color)
|
nuclear@14
|
151 {
|
nuclear@14
|
152 draw_rect(pos, sz, color, color);
|
nuclear@14
|
153 }
|
nuclear@14
|
154
|
nuclear@14
|
155 static void draw_rect(const Vec2 &pos, const Vec2 &sz, const Color &ctop, const Color &cbot)
|
nuclear@13
|
156 {
|
nuclear@13
|
157 float aspect = sz.x / sz.y;
|
nuclear@13
|
158
|
nuclear@13
|
159 bind_program(prog_color);
|
nuclear@13
|
160
|
nuclear@13
|
161 gl_begin(GL_QUADS);
|
nuclear@14
|
162 gl_color4f(cbot.r, cbot.g, cbot.b, cbot.a);
|
nuclear@13
|
163 gl_texcoord2f(0, 1);
|
nuclear@14
|
164 gl_vertex3f(pos.x, pos.y, 0);
|
nuclear@13
|
165 gl_texcoord2f(aspect, 1);
|
nuclear@14
|
166 gl_vertex3f(pos.x + sz.x, pos.y, 0);
|
nuclear@14
|
167 gl_color4f(ctop.r, ctop.g, ctop.b, ctop.a);
|
nuclear@13
|
168 gl_texcoord2f(aspect, 0);
|
nuclear@14
|
169 gl_vertex3f(pos.x + sz.x, pos.y + sz.y, 0);
|
nuclear@13
|
170 gl_texcoord2f(0, 0);
|
nuclear@14
|
171 gl_vertex3f(pos.x, pos.y + sz.y, 0);
|
nuclear@13
|
172 gl_end();
|
nuclear@13
|
173 }
|
nuclear@13
|
174
|
nuclear@14
|
175 static void draw_text(float justify, float x, float y, const char *text)
|
nuclear@7
|
176 {
|
nuclear@7
|
177 struct dtx_glyphmap *gmap = dtx_get_font_glyphmap_idx(font, 0);
|
nuclear@7
|
178 dtx_use_font(font, dtx_get_glyphmap_ptsize(gmap));
|
nuclear@7
|
179
|
nuclear@14
|
180 float twidth = dtx_string_width(text);
|
nuclear@14
|
181 float thalf = twidth / 2.0;
|
nuclear@7
|
182
|
nuclear@7
|
183 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
184 gl_push_matrix();
|
nuclear@7
|
185 gl_load_identity();
|
nuclear@14
|
186 gl_translatef(x - thalf - justify * thalf, y + 8, 0);
|
nuclear@7
|
187
|
nuclear@7
|
188 bind_program(prog_font);
|
nuclear@7
|
189 set_uniform_float4(prog_font, "ucolor", 1.0, 1.0, 1.0, 1.0);
|
nuclear@14
|
190 gl_apply_xform(prog_font);
|
nuclear@7
|
191
|
nuclear@7
|
192 dtx_string(text);
|
nuclear@7
|
193
|
nuclear@7
|
194 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@7
|
195 gl_pop_matrix();
|
nuclear@9
|
196 }
|
nuclear@14
|
197
|
nuclear@14
|
198 static void draw_frame(const Vec2 &pos, const Vec2 &sz, float inset)
|
nuclear@14
|
199 {
|
nuclear@14
|
200 float x = pos.x - BEVEL;
|
nuclear@14
|
201 float y = pos.y - BEVEL;
|
nuclear@14
|
202 float w = sz.x + BEVEL * 2.0;
|
nuclear@14
|
203 float h = sz.y + BEVEL * 2.0;
|
nuclear@14
|
204 float b = BEVEL;
|
nuclear@14
|
205
|
nuclear@14
|
206 Color tcol = lerp(colors[BEVEL_LIT_COLOR], colors[BEVEL_SHAD_COLOR], inset);
|
nuclear@14
|
207 Color bcol = lerp(colors[BEVEL_SHAD_COLOR], colors[BEVEL_LIT_COLOR], inset);
|
nuclear@14
|
208
|
nuclear@14
|
209 bind_program(prog_color);
|
nuclear@14
|
210
|
nuclear@14
|
211 gl_begin(GL_QUADS);
|
nuclear@14
|
212 gl_color4f(tcol.r, tcol.g, tcol.b, tcol.a);
|
nuclear@14
|
213 gl_vertex2f(x + b, y + h - b);
|
nuclear@14
|
214 gl_vertex2f(x + w - b, y + h - b);
|
nuclear@14
|
215 gl_vertex2f(x + w, y + h);
|
nuclear@14
|
216 gl_vertex2f(x, y + h);
|
nuclear@14
|
217
|
nuclear@14
|
218 gl_vertex2f(x + b, y + b);
|
nuclear@14
|
219 gl_vertex2f(x, y);
|
nuclear@14
|
220 gl_vertex2f(x, y + h);
|
nuclear@14
|
221 gl_vertex2f(x + b, y + h - b);
|
nuclear@14
|
222
|
nuclear@14
|
223 gl_color4f(bcol.r, bcol.g, bcol.b, bcol.a);
|
nuclear@14
|
224 gl_vertex2f(x, y);
|
nuclear@14
|
225 gl_vertex2f(x + b, y + b);
|
nuclear@14
|
226 gl_vertex2f(x + w - b, y + b);
|
nuclear@14
|
227 gl_vertex2f(x + w, y);
|
nuclear@14
|
228
|
nuclear@14
|
229 gl_vertex2f(x + w - b, y + b);
|
nuclear@14
|
230 gl_vertex2f(x + w, y);
|
nuclear@14
|
231 gl_vertex2f(x + w, y + h);
|
nuclear@14
|
232 gl_vertex2f(x + w - b, y + h - b);
|
nuclear@14
|
233 gl_end();
|
nuclear@14
|
234 }
|
nuclear@14
|
235
|
nuclear@14
|
236 static Color lerp(const Color &a, const Color &b, float t)
|
nuclear@14
|
237 {
|
nuclear@14
|
238 Color res;
|
nuclear@14
|
239 res.r = a.r + (b.r - a.r) * t;
|
nuclear@14
|
240 res.g = a.g + (b.g - a.g) * t;
|
nuclear@14
|
241 res.b = a.b + (b.b - a.b) * t;
|
nuclear@14
|
242 return res;
|
nuclear@14
|
243 }
|