typedef i16 ui_px;
typedef ui_px ui_rect[4];
+typedef ui_px ui_point[2];
typedef struct ui_vert ui_vert;
enum ui_axis {
void (*enter)( char *, u32 ),
(*up)( char *, u32 ),
(*down)( char *, u32 ),
- (*change)( char *, u32 );
+ (*change)( char *, u32 ),
+ (*escape)( void );
}
callbacks;
}
cursor;
SDL_Cursor *cursor_map[ k_ui_cursor_max ];
+
+ v4f colour;
}
static vg_ui = {
.scheme = {
[ k_ui_purple + k_ui_brighter ] = UI_RGB( 0xd3869b ),
[ k_ui_gray + k_ui_brighter ] = UI_RGB( 0xa89984 ),
},
- .font = &vg_ui_font_small
+ .font = &vg_ui_font_small,
+ .colour = {1.0f,1.0f,1.0f,1.0f}
};
static struct vg_shader _shader_ui =
.orig_file = NULL,
.static_src =
"uniform sampler2D uTexGlyphs;"
+ "uniform vec4 uColour;"
"out vec4 FragColor;"
""
"in vec2 aTexCoords;"
"diffuse.a = texture( uTexGlyphs, aTexCoords ).r;"
"}"
- "FragColor = diffuse;"
+ "FragColor = diffuse * uColour;"
"}"
}
};
.orig_file = NULL,
.static_src =
"uniform sampler2D uTexImage;"
+ "uniform vec4 uColour;"
"out vec4 FragColor;"
"in vec2 aTexCoords;"
"void main()"
"{"
"vec4 colour = texture( uTexImage, aTexCoords );"
- "FragColor = colour;"
+ "FragColor = colour * uColour;"
"}"
}
};
-VG_STATIC void _vg_ui_init(void){
+static void _vg_ui_init(void){
if( !vg_shader_compile( &_shader_ui ) ||
!vg_shader_compile( &_shader_ui_image ) )
vg_fatal_error( "Failed to compile ui shader" );
b[i] = a[i];
}
-VG_STATIC void ui_flush( enum ui_shader shader ){
+static void ui_flush( enum ui_shader shader ){
u32 vertex_offset = vg_ui.vert_start*sizeof(ui_vert),
vertex_count = vg_ui.cur_vert-vg_ui.vert_start,
vertex_size = vertex_count*sizeof(ui_vert),
glUniformMatrix3fv( glGetUniformLocation( _shader_ui.id, "uPv" ), 1,
GL_FALSE, (float *)view );
+ glUniform4fv( glGetUniformLocation( _shader_ui.id, "uColour" ), 1,
+ vg_ui.colour );
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs );
glUniformMatrix3fv( glGetUniformLocation( _shader_ui_image.id, "uPv" ), 1,
GL_FALSE, (float *)view );
glUniform1i( glGetUniformLocation(_shader_ui_image.id,"uTexImage"), 0 );
+ glUniform4fv( glGetUniformLocation( _shader_ui_image.id, "uColour" ), 1,
+ vg_ui.colour );
}
else
vg_fatal_error( "Invalid UI shader (%d)\n", shader );
out_texcoords[3] = out_texcoords[1] + font->glyph_height;
}
+static u32 ui_opacity( u32 colour, f32 opacity ){
+ u32 alpha = opacity * 255.0f;
+ return (colour & 0x00ffffff) | (alpha << 24);
+}
+
static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale,
enum ui_align align, u32 colour ){
ui_rect text_cursor;
out_rect, inout_panel );
}
+static void ui_info( ui_rect inout_panel, const char *text ){
+ ui_rect box;
+ ui_standard_widget( inout_panel, box, 1 );
+ ui_text( box, text, 1, k_ui_align_middle_left, 0 );
+}
static void ui_image( ui_rect rect, GLuint image ){
ui_flush( k_ui_shader_colour );
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, image );
- ui_fill_rect( rect, 0xffffffff, (ui_px[4]){ 0,128, 128, 0 } );
+ ui_fill_rect( rect, 0xffffffff, (ui_px[4]){ 0,256,256,0 } );
ui_flush( k_ui_shader_image );
}
static void ui_defocus_all(void){
if( vg_ui.focused_control_type == k_ui_control_textbox ){
SDL_StopTextInput();
+ if( vg_ui.textbox.callbacks.escape )
+ vg_ui.textbox.callbacks.escape();
}
+ vg_ui.ignore_input_frames = 2;
vg_ui.focused_control_id = NULL;
vg_ui.focused_control_hit = 0;
vg_ui.focused_control_type = k_ui_control_none;
static void _ui_textbox_enter(void){
if( vg_ui.focused_control_type == k_ui_control_textbox ){
+ vg_ui.ignore_input_frames = 2;
+
if( vg_ui.textbox.callbacks.enter )
vg_ui.textbox.callbacks.enter( vg_ui.textbuf, vg_ui.textbox.len );
/*
* Callback for text entry mode
*/
-VG_STATIC void ui_proc_utf8( const char *text ){
+static void ui_proc_utf8( const char *text ){
if( vg_ui.focused_control_type == k_ui_control_textbox ){
const char *ptr = text;