shape glyphs, ui drawcall colour
[vg.git] / vg_imgui.h
index 6e8537c2882bd142880951432325396ac1acdd26..53d8472302f8f3f5e6acb07a81e1860d654a5084 100644 (file)
@@ -220,6 +220,8 @@ struct{
    cursor;
 
    SDL_Cursor *cursor_map[ k_ui_cursor_max ];
+
+   v4f colour;
 } 
 static vg_ui = {
    .scheme = {
@@ -258,7 +260,8 @@ static vg_ui = {
       [ 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 =
@@ -292,6 +295,7 @@ static struct vg_shader _shader_ui =
       .orig_file = NULL,
       .static_src = 
        "uniform sampler2D uTexGlyphs;"
+   "uniform vec4 uColour;"
        "out vec4 FragColor;"
        ""
        "in vec2 aTexCoords;"
@@ -309,7 +313,7 @@ static struct vg_shader _shader_ui =
                        "diffuse.a = texture( uTexGlyphs, aTexCoords ).r;"
                "}"
                
-               "FragColor = diffuse;"
+               "FragColor = diffuse * uColour;"
        "}"
    }
 };
@@ -344,6 +348,7 @@ static struct vg_shader _shader_ui_image = {
       .orig_file = NULL,
       .static_src = 
        "uniform sampler2D uTexImage;"
+   "uniform vec4 uColour;"
        "out vec4 FragColor;"
 
        "in vec2 aTexCoords;"
@@ -353,12 +358,12 @@ static struct vg_shader _shader_ui_image = {
        "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" );
@@ -475,7 +480,7 @@ static void rect_copy( ui_rect a, ui_rect b ){
       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),
@@ -512,6 +517,8 @@ VG_STATIC void ui_flush( enum ui_shader shader ){
       
       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 );
@@ -522,6 +529,8 @@ VG_STATIC void ui_flush( enum ui_shader shader ){
       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 );
@@ -850,6 +859,11 @@ static void ui_text_glyph( const struct ui_font *font, ui_px scale,
    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;
@@ -984,12 +998,17 @@ static void ui_standard_widget( ui_rect inout_panel, ui_rect out_rect,
              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 );
 }
 
@@ -2041,7 +2060,7 @@ static void _ui_proc_key( SDL_Keysym ev ){
 /*
  * 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;