From 3013df439a15c3c4b4078ea9724f15d6a1cb3820 Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 11 Sep 2023 07:26:51 +0100 Subject: [PATCH] general imgui improvements & tabs --- compile_font.sh | 1 + src/fonts/vg_font_thin.png | Bin 12989 -> 10987 bytes src/fonts/vg_font_thin.xcf | Bin 182736 -> 165992 bytes src/fonts/vg_font_thin_v1.png | Bin 0 -> 12989 bytes submodules/SDL_GameControllerDB | 2 +- submodules/anyascii | 2 +- submodules/qoi | 2 +- submodules/stb | 2 +- vg_console.h | 9 +- vg_imgui.h | 622 ++++++++++++++++++-------------- vg_pxfont_thin.h | 356 +++++++++--------- 11 files changed, 533 insertions(+), 463 deletions(-) create mode 100755 compile_font.sh create mode 100644 src/fonts/vg_font_thin_v1.png diff --git a/compile_font.sh b/compile_font.sh new file mode 100755 index 0000000..929b865 --- /dev/null +++ b/compile_font.sh @@ -0,0 +1 @@ +./vg/bin/fontcomp vg/src/fonts/vg_font_thin.png vg/vg_pxfont_thin.h diff --git a/src/fonts/vg_font_thin.png b/src/fonts/vg_font_thin.png index 78a2cbca42c61cc1745ffde72e09e877b41da4dc..f03727a147c6f797820617366b557806590b2a07 100644 GIT binary patch delta 7018 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 literal 182736 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

u#Ka4eUj{&Uapu#G*MSu za=w~!X_gUebaNwmIm@R8y3Qv6=Zd;Lc#;OY1!z)gHU63|g>b8I{0@kZ$HOGI#W!6B z-#dMz-Oh<{8ibIb51c#Wi`$-&t~dPod-T0VW$j5_?d{#ule*fwc2BRTsVuqQ)#BII z%31?mF&|6ockpfXR-0a__Zz*9o>SRDif&~vv*b-*&T8nX+e02vg!75N5N2fQnd{0Z)u%Mk1 z#HL$o@s!%KF>M))O#~afjg`BqRGHE?L#;v#g;WEgf~q-)LU#~zOqrcW;{dXEgh2&y z)2vo-M8nFqHh)#wKLHB+sd&Ck!X zRYs7FKm$PCkuoN8$z5j?s00j^<$_ZPC5R<|xiVKpVMrdV1bIB8W(f2(BVSTlwIQSZ zphT&Js~i`|HBeFx0%B%PRTb2%$*KC)8RejvWlm$&&+dtBH!Q#H+(ixv>dLsiDWKM) zMQQB{)?iiPDN1YRF{RZ)vxJ>Fk92+hds13^Qd)abT5YCx)RHWEds_~j_WE06o8D!^ zmVDD^Yn!2Cf^P(-e-WyWgJd(w=~brsnBFJ80d)zNgxw@b*Bqae*3M1{rPUHO57l#f z+5IU#>69ABEa`ajn3p{uq_NzLVf%b#qO>i|EO5ajk*#ji@L~c39q84{64E5(5Q5&P z*hG}-%AHzCLM7%(*bJ#_a;oC&bj541DOv%%DJas|goUmYU^{1ZjzN}GSL;Vj($yxU zYn_&$uQRG^5Cv*J-Z0hGqLb>{CaE%M%W+a&J7iagpk_`X`N|Fd*ra#d8zz}8zUh)! z^bzSiSx=cR?Gti&!@5bko$YWD%GthRaUSZu11wx_{wB*cvzu-txQR81>&77_pn9Iz2Jl2LtC= z2R|-|8e?PMKmbm5C>~gTP4MzZ?D`U#;qeD84E*eT_gXIBQV0Xr{T0Ta2nC9_(>_6hUZQqyUnlj`{%1YtG)JCO&OW?5WH{0Gd@-O%^LfqJEq&has%da zY_}WJWnJT|{|eoe7MmC3_4240uUR9l;8~36W0w%x26Wq8Q8kie1d@5?DTQAc486|Q zkz!|K%KWuqVbbe-t%)&aL2g?xFSrwUQ^9pvtf!FRR>1~&?c6#}D=VdP_?08G`d9^o zG#jV|rOIc;-DWzQ2@0u|xnZDRfDqLsA6GyeGBgIKV6}h<>ciwMgx6HN1|Q&8f&^+l ztz*is`H2fqFMtG6(j5#plx@I%;%~*6EtGw-1>NZc_*a1 z@vD9WG7g0qV!pn@SkkBmwt(@hMnB|RMeJrAOc)mGUE-)uivvs*I%5hly&smP%q+dLn)V6T$UF;RyQ&M0MOgK2onwt6;hmC)Fbr93z-QP38G z=C?ehP9-zgHP2?#$po1iZ2JGVcP+bh6hZXf8$~3(Mp+tRgn$)-@Yr|}R`4Hu2^+KF zd-ypgHVKM3r@E@Ts^@WyJ!APwt;Cw{+pn4F>YA!Er)!EzX$G@q*t@|uR;C;6=l1AE z-lTrwT}gV;YCdTk_F4a@xO>K6chg}a&nOwGJB^zub%2$>L8tA>VP_Ju*BUYDF-hds-$ zKuq80K%Wmz;R`*v%iZtt&BlUPGNb}=%X%zS>VJX1Vo;^$z5uNjq7FP1-;aET-*;Ez z74(efDwO8z&3d)tXE=AmZR7FsVZY<-b9$O~&o`7_#2tpc(oUmad_lndO^`a;wRT^Pn6w@p%jo z+Td05SxCL{0e5df$aRT_q(ZzMH|d5*#GG0el)TEwFx(bzXQWtyu_LSXsMk zM$R>43jA9nok%Mw&yidH%yZI^G)NJn!iWroBy$?*ivZ7DA12g9X6w=^*ci^ZbOdGw zSA=DEkVj~^BIiuqDQA*vR+KcK&RF%aVRAHbs53#}%QnDh(}U$_X$!Yr_3YAONC`+ zj=g+j2hOy*+Js0!YO+#6OsjiuK&;XZNddGVoJ~;!m<~|Tk2N}GQzqH!+>-$ahzRzc z+zh6C$XvvR0Wl@I3rdwiS%j1c{rYvvesL=$hz#J&vXJF6TCw*AX}9;J#A;W2PktU` z#okLTBE%Kb>=E{!GhiQ6;#=}-#zPYXnpv``D7TudScTqhVtbSTzQ*Wo5UlxZVA1Wa zKxTEWC`1+V?MSMmJckcl(%|z206;b1TLtcNV)c!b)-0rruPRi=V7Eae4W&XvTqK=# zDk;yAoDG97HY9magr)EZLm@ekUUmP0tH7ihCLJ=?vfyL@=t@U4_z39QD8=BDF)~y( zm$UgX8&8@~XRP|zvCv(28yI|>KywYrTUFrBeN8GiWwQQFMU8TgU~EvoaeqW=o|XRG zI0q5fs;}o$PYxzik@53d5jLw*0UeSEq?`yNla>cNYZO{(e&9|_Ypj&#G0$8A_?KR;9x=<`2EG?G02UvNYz)Xw2KoaFELrxPK8gNTNU@?^~p8AR5sV9~oJJgA% z1#SfdN<8(e!SG)@mii;gUn_=M2(Ao8z_WqGdY}k~OCX|I*sd0j!Gadluo4#8*aGto z1KTn{#5sCq?+nHuQ6CI8MKk$l!^p*di57+1%1{ajkMR6&{K5bV-{Z)Dz+3e59n$4I zNYX7iY5s#25WRkl%DnqbzX1*Qa{HG6vjvr#0uhp`5D@|t)(_$|$SdF@ zkVa8iaj3fkv4X>*x(!KC%0VgtV&e%h46q}w#H^%xX$vz#?kkLCnnLhMK6N^(eA&%k96;hQ>6XoX?+aRu@+UTp+2Z zG_#3}gX$JdX(};YIuCvo$rHu+^-KE6s6w zgjAA-=zwc8;WqJiIsS3>d=DD_DI@}1Vx4;;t6Q0S3pDU?4*{vulwWCvDc0ma`?JXh z^jj%G%ommK8_Oeb(fRB+d`NpJjN2RNE=Ir5Rs$*E=R_EN9i5)-ZQIE;K5#CB3{ZIg zMyk}tLy((6@D=r`+C^`at`T9S?E09jj8GSRSz~=ue^4Rua!1aj=ppM{gIJ8#g<=ts zz1Fpm=%aOMl}J5f-IrP;!XvdPJxkQM-T!pZ?Nub-reC6lT4SfRmgQ^upQV#7Mpj$TNe?^UmVO2~CTWjm*ZyKx? zLxOvX$_iX%e0C1H733DxZAhY6j%o>X8&8Pwg&nIU$R*WFTbl{B3guSEv{-!dtJSO) zqRp9Fh>{)FR}0a4<|EhpBWU|L!kr@#WPp{y29)zHJk^Oz0&G*88t|Y3v}&dJrD6>@ zw9x>uoG{LpzH#7d0{m%CD6E0{Dj_p%;?W2bZz9Zy9VC92`T8UCrtwhNtG!|bTDgR3MTL$oVku@tZO==uetwbqz zD^bF_?nGq+0#k(z#feC)3_4Sz5+u!I*z5O&B!p8lKo`$K`B&U*X7Hd(2^9FBUi?t}N2GZcx;suQ#-ONI3u~Z)u z34SXR3mghgn&7F(H;phEb%aJfOo^2K_lRI2yGbT1Bg6z>_gLRlCe%*6=8IP5OetC4 z8a!gOF0_mg_qDEsUZ3ih<48SY@|PY*Bur{iq?V{rOvX!m+6;g9`sNnSM10)Uj_TbT z(sy*n74MIP|Hj?_H2hV_X|)+SbVYr}CRaqCF+3;-e)xme^dX6SKzX0BW1F%2eRPOV z)TNEM*x#64Gxl3+a6GyEiuXy@8fIbq13YWb&{Y3pvo!YGlbb1+lp=w4>@x?0zRz5R zl_>Fj&80PBYh|h9ifc|eJKb+9*7nj~#{+CeNYvmZ8P=M61>L5UJJe?^$iyL;87*J> z4nB5&554}G_I-^V+ZyYB8)j?(I4|Z^tZ0dJ8?w)w+<}E;Y|KX+`)#qcv6Qvn_OsCa z7(*udnmg7t*Znrk-16@L%yylz31!>|ly{qQm6?0Mj2xQLK4X2x4#~)!%1yf*>v6?3 z*8Mg}Q1{ygM6WTcRqoUQt9Z=PAN#Fa|NTvA^MlK2 Y-Qzw!kGuG7o6Y7={lj7NtNv~N1NaNyH~;_u diff --git a/src/fonts/vg_font_thin_v1.png b/src/fonts/vg_font_thin_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..78a2cbca42c61cc1745ffde72e09e877b41da4dc GIT binary patch literal 12989 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 X+HJkdxiP^Y3}9|*Wm0nd(v|-MQ`t)1 literal 0 HcmV?d00001 diff --git a/submodules/SDL_GameControllerDB b/submodules/SDL_GameControllerDB index 6ed8d05..c5b4df0 160000 --- a/submodules/SDL_GameControllerDB +++ b/submodules/SDL_GameControllerDB @@ -1 +1 @@ -Subproject commit 6ed8d054340ee8a93a684e11360b66cd8a5c168e +Subproject commit c5b4df0e1061175cb11e3ebbf8045178339864a5 diff --git a/submodules/anyascii b/submodules/anyascii index 44e971c..eb5332d 160000 --- a/submodules/anyascii +++ b/submodules/anyascii @@ -1 +1 @@ -Subproject commit 44e971c774d9ec67ca6c1f16c5a476724821ab63 +Subproject commit eb5332d0b5e48d58397e6f27475a18e058330d23 diff --git a/submodules/qoi b/submodules/qoi index b8d77df..dfc056e 160000 --- a/submodules/qoi +++ b/submodules/qoi @@ -1 +1 @@ -Subproject commit b8d77df1e80b652a57f0b7270449b179a6b91f40 +Subproject commit dfc056e813c98d307238d35f7f041a725d699dfc diff --git a/submodules/stb b/submodules/stb index 8b5f1f3..5736b15 160000 --- a/submodules/stb +++ b/submodules/stb @@ -1 +1 @@ -Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 +Subproject commit 5736b15f7ea0ffb08dd38af21067c314d6a3aae9 diff --git a/vg_console.h b/vg_console.h index a38a64d..25bad63 100644 --- a/vg_console.h +++ b/vg_console.h @@ -682,7 +682,7 @@ VG_STATIC void _vg_console_draw(void) SDL_AtomicLock( &log_print_sl ); int ptr = vg_log.log_line_current; - int const fh = 14, log_lines = 32; + int const fh = vg_ui.font->line_height, log_lines = 32; int console_lines = VG_MIN( log_lines, vg_log.log_line_count ); ui_rect rect_log = { 0, 0, vg.window_x, log_lines*fh }, @@ -716,7 +716,8 @@ VG_STATIC void _vg_console_draw(void) .change = _vg_console_on_update, .enter = _vg_console_on_enter }; - ui_textbox( rect_input, vg_console.input, vg_list_size(vg_console.input), + ui_textbox( rect_input, NULL, + vg_console.input, vg_list_size(vg_console.input), 1, UI_TEXTBOX_AUTOFOCUS, &callbacks ); /* @@ -726,9 +727,9 @@ VG_STATIC void _vg_console_draw(void) ui_rect rect_suggest; rect_copy( rect_input, rect_suggest ); - rect_suggest[0] += 6 + UI_GLYPH_SPACING_X*vg_console.suggestion_pastepos; + rect_suggest[0] += 6 + vg_ui.font->spacing*vg_console.suggestion_pastepos; rect_suggest[1] += rect_input[3]; - rect_suggest[2] = UI_GLYPH_SPACING_X * vg_console.suggestion_maxlen; + rect_suggest[2] = vg_ui.font->spacing * vg_console.suggestion_maxlen; rect_suggest[3] = vg_console.suggestion_count * fh; ui_fill( rect_suggest, bg_colour ); diff --git a/vg_imgui.h b/vg_imgui.h index 8938acb..6e8537c 100644 --- a/vg_imgui.h +++ b/vg_imgui.h @@ -52,7 +52,7 @@ enum ui_align struct ui_vert { ui_px co[2]; - u8 uv[2]; + u16 uv[2]; u32 colour; }; #pragma pack(pop) @@ -73,11 +73,45 @@ enum ui_scheme_colour{ }; static ui_px k_ui_widget_height = 28, - k_ui_scale = 2, + k_ui_scale = 1, k_ui_padding = 8; typedef u32 ui_scheme[8*4]; +struct ui_font { + ui_px glyph_width, + glyph_height, + glyph_baseline, + line_height, + sheet_size, + spacing, + offset_y; + + u8 ascii_start; +}; +typedef struct ui_font ui_font; + +static const ui_font vg_ui_font_small = { + .glyph_width = 8, + .glyph_height = 14, + .glyph_baseline = 4, + .line_height = 14, + .sheet_size = 256, + .spacing = 8, + .ascii_start = ' ', + .offset_y = 0 +}, +vg_ui_font_big = { + .glyph_width = 12, + .glyph_height = 21, + .glyph_baseline = 6, + .line_height = 21, + .sheet_size = 256, + .spacing = 10, + .ascii_start = ' ', + .offset_y = 84 +}; + #define UI_RGB( STDHEX ) 0xff000000 |\ ((STDHEX&0x000000ff)<<16) |\ ((STDHEX&0x0000ff00) ) |\ @@ -97,6 +131,11 @@ typedef u32 ui_scheme[8*4]; #define UI_MOUSE_RIGHT (SDL_BUTTON(SDL_BUTTON_RIGHT)) #define UI_MOUSE_MIDDLE (SDL_BUTTON(SDL_BUTTON_MIDDLE)) +#define UI_TOP 0x1 +#define UI_LEFT 0x2 +#define UI_BOTTOM 0x4 +#define UI_RIGHT 0x8 + struct{ struct ui_vert *vertex_buffer; u16 *indice_buffer; @@ -170,6 +209,7 @@ struct{ float click_fade_opacity; ui_scheme scheme; + const ui_font *font; enum ui_cursor{ k_ui_cursor_default, @@ -217,7 +257,8 @@ static vg_ui = { [ k_ui_blue + k_ui_brighter ] = UI_RGB( 0x83a598 ), [ k_ui_purple + k_ui_brighter ] = UI_RGB( 0xd3869b ), [ k_ui_gray + k_ui_brighter ] = UI_RGB( 0xa89984 ), - } + }, + .font = &vg_ui_font_small }; static struct vg_shader _shader_ui = @@ -240,7 +281,7 @@ static struct vg_shader _shader_ui = "void main()" "{" "gl_Position = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );" - "aTexCoords = a_uv * 0.0078125;" + "aTexCoords = a_uv * 0.00390625;" /* TODO: Uniform */ "aColour = a_colour;" "aWsp = a_co;" @@ -258,12 +299,6 @@ static struct vg_shader _shader_ui = "" "in vec2 aWsp;" - "vec2 rand_hash22( vec2 p )" - "{" - "vec3 p3 = fract(vec3(p.xyx) * 213.8976123);" - "p3 += dot(p3, p3.yzx+19.19);" - "return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));" - "}" "" "void main()" "{" @@ -279,8 +314,7 @@ static struct vg_shader _shader_ui = } }; -static struct vg_shader _shader_ui_image = -{ +static struct vg_shader _shader_ui_image = { .name = "[vg] ui_image", .link = NULL, .vs = @@ -299,7 +333,7 @@ static struct vg_shader _shader_ui_image = "void main()" "{" "gl_Position = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );" - "aTexCoords = a_uv * 0.0078125;" + "aTexCoords = a_uv * 0.00390625;" "aColour = a_colour;" "aWsp = a_co;" @@ -323,10 +357,8 @@ static struct vg_shader _shader_ui_image = "}" } }; -#define UI_GLYPH_SPACING_X 8 -VG_STATIC void _vg_ui_init(void) -{ +VG_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" ); @@ -367,7 +399,7 @@ VG_STATIC void _vg_ui_init(void) glEnableVertexAttribArray( 0 ); /* UV */ - glVertexAttribPointer( 1, 2, GL_UNSIGNED_BYTE, GL_FALSE, stride, + glVertexAttribPointer( 1, 2, GL_UNSIGNED_SHORT, GL_FALSE, stride, (void *)offsetof( struct ui_vert, uv ) ); glEnableVertexAttribArray( 1 ); @@ -408,19 +440,6 @@ VG_STATIC void _vg_ui_init(void) } data++; } - -#if 0 - for( u32 y=1; y<256; y++ ){ - for( u32 x=0; x<256; x++ ){ - u32 above = (y-1)*256 + x, - below = y*256+x; - - if( (image[ below ] == 0) && (image[ above ] == 255) ){ - image[ below ] = 128; - } - } - } -#endif glGenTextures( 1, &vg_ui.tex_glyphs ); glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs ); @@ -451,14 +470,12 @@ enum ui_shader { k_ui_shader_image }; -static void rect_copy( ui_rect a, ui_rect b ) -{ +static void rect_copy( ui_rect a, ui_rect b ){ for( int i=0; i<4; i++ ) b[i] = a[i]; } -VG_STATIC void ui_flush( enum ui_shader shader ) -{ +VG_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), @@ -518,8 +535,7 @@ VG_STATIC void ui_flush( enum ui_shader shader ) vg_ui.vert_start = vg_ui.cur_vert; } -static void ui_fill_rect( ui_rect rect, u32 colour, ui_px uv[4] ) -{ +static void ui_fill_rect( ui_rect rect, u32 colour, ui_px uv[4] ){ /* this if far from ideal but stops us from crashing */ if( (vg_ui.cur_vert + 4 > vg_ui.max_verts) || (vg_ui.cur_indice + 6 > vg_ui.max_indices)) @@ -561,13 +577,11 @@ static void ui_fill_rect( ui_rect rect, u32 colour, ui_px uv[4] ) vg_ui.cur_vert += 4; } -static void ui_fill( ui_rect rect, u32 colour ) -{ +static void ui_fill( ui_rect rect, u32 colour ){ ui_fill_rect( rect, colour, (ui_px[4]){ 4,4,4,4 } ); } -static void ui_outline( ui_rect rect, ui_px thickness, u32 colour ) -{ +static void ui_outline( ui_rect rect, ui_px thickness, u32 colour, u32 mask ){ /* this if far from ideal but stops us from crashing */ if( (vg_ui.cur_vert + 8 > vg_ui.max_verts) || (vg_ui.cur_indice + 24 > vg_ui.max_indices)) @@ -602,18 +616,24 @@ static void ui_outline( ui_rect rect, ui_px thickness, u32 colour ) u16 start = vg_ui.cur_vert; u32 mesh[] = { 0,5,4, 0,1,5, 1,6,5, 1,2,6, 2,7,6, 2,3,7, 3,4,7, 3,0,4 }; - for( u32 i=0; ispacing; } -static ui_px ui_text_string_height( const char *str ) -{ +static ui_px ui_text_string_height( const char *str ){ int height = 1; const char *_c = str; u8 c; @@ -698,8 +712,7 @@ static ui_px ui_text_string_height( const char *str ) } static ui_px ui_text_aligned_x( const char *str, ui_rect rect, ui_px scale, - enum ui_align align ) -{ + enum ui_align align ){ enum ui_align lwr = k_ui_align_lwr & align; if( lwr == k_ui_align_left ){ return rect[0]; @@ -716,13 +729,11 @@ static ui_px ui_text_aligned_x( const char *str, ui_rect rect, ui_px scale, static ui_px ui_min( ui_px a, ui_px b ){ return ab?a:b; } -static ui_px ui_clamp( ui_px a, ui_px min, ui_px max ) -{ +static ui_px ui_clamp( ui_px a, ui_px min, ui_px max ){ return ui_min( max, ui_max( a, min ) ); } -static int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ) -{ +static int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ){ ui_px parent_max[2], child_max[2]; parent_max[0] = parent[0]+parent[2]; parent_max[1] = parent[1]+parent[3]; @@ -744,21 +755,18 @@ static int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ) return 1; } -static int ui_inside_rect( ui_rect rect, ui_px co[2] ) -{ +static int ui_inside_rect( ui_rect rect, ui_px co[2] ){ if( co[0] >= rect[0] && co[1] >= rect[1] && co[0] < rect[0]+rect[2] && - co[1] < rect[1]+rect[3] ) - { + co[1] < rect[1]+rect[3] ){ return 1; } else return 0; } -static int ui_click_down( u32 mask ) -{ +static int ui_click_down( u32 mask ){ if( vg_ui.ignore_input_frames ) return 0; if( (vg_ui.mouse_state[0] & mask) && !(vg_ui.mouse_state[1] & mask) ) @@ -767,14 +775,12 @@ static int ui_click_down( u32 mask ) return 0; } -static int ui_clicking( u32 mask ) -{ +static int ui_clicking( u32 mask ){ if( vg_ui.ignore_input_frames ) return 0; return vg_ui.mouse_state[0] & mask; } -static int ui_click_up( u32 mask ) -{ +static int ui_click_up( u32 mask ){ if( vg_ui.ignore_input_frames ) return 0; if( (vg_ui.mouse_state[1] & mask) && !(vg_ui.mouse_state[0] & mask) ) @@ -783,8 +789,7 @@ static int ui_click_up( u32 mask ) return 0; } -static void ui_prerender(void) -{ +static void ui_prerender(void){ int x, y; vg_ui.mouse_state[1] = vg_ui.mouse_state[0]; vg_ui.mouse_state[0] = SDL_GetMouseState( &x, &y ); @@ -810,14 +815,12 @@ static void ui_prerender(void) } } -static u32 ui_colour( enum ui_scheme_colour id ) -{ +static u32 ui_colour( enum ui_scheme_colour id ){ return vg_ui.scheme[ id ]; } /* get an appropriately contrasting colour given the base */ -static u32 ui_colourcont( enum ui_scheme_colour id ) -{ +static u32 ui_colourcont( enum ui_scheme_colour id ){ if ( id < k_ui_bg+6 ) return ui_colour( k_ui_fg ); else if( id < k_ui_fg ) return ui_colour( k_ui_bg+1 ); else if( id < k_ui_hue ) return ui_colour( k_ui_bg+3 ); @@ -825,8 +828,7 @@ static u32 ui_colourcont( enum ui_scheme_colour id ) else return ui_colour( k_ui_fg+1 ); } -static void ui_hex_to_norm( u32 hex, v4f norm ) -{ +static void ui_hex_to_norm( u32 hex, v4f norm ){ norm[0] = ((hex ) & 0xff); norm[1] = ((hex>>8 ) & 0xff); norm[2] = ((hex>>16) & 0xff); @@ -834,9 +836,22 @@ static void ui_hex_to_norm( u32 hex, v4f norm ) v4_muls( norm, 1.0f/255.0f, norm ); } +static void ui_text_glyph( const struct ui_font *font, ui_px scale, + u8 glyph, ui_rect out_texcoords ){ + glyph -= font->ascii_start; + + ui_px per_row = font->sheet_size / font->glyph_width, + column = (ui_px)glyph % per_row, + row = (glyph - column) / per_row; + + out_texcoords[0] = column * font->glyph_width; + out_texcoords[1] = row * font->glyph_height + font->offset_y; + out_texcoords[2] = out_texcoords[0] + font->glyph_width; + out_texcoords[3] = out_texcoords[1] + font->glyph_height; +} + static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, - enum ui_align align, u32 colour ) -{ + enum ui_align align, u32 colour ){ ui_rect text_cursor; if( colour == 0 ) colour = ui_colour( k_ui_fg ); @@ -847,8 +862,8 @@ static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, text_cursor[0] = ui_text_aligned_x( str, rect, scale, align ); text_cursor[1] = rect[1]; - text_cursor[2] = 8*scale; - text_cursor[3] = 14*scale; + text_cursor[2] = vg_ui.font->glyph_width*scale; + text_cursor[3] = vg_ui.font->glyph_height*scale; u32 printed_chars = 0; @@ -864,52 +879,29 @@ static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, while( (c = *(_c ++)) ){ if( printed_chars >= len ){ printed_chars = 0; - text_cursor[1] += 14*scale; + text_cursor[1] += vg_ui.font->line_height*scale; text_cursor[0] = ui_text_aligned_x( _c, rect, scale, align ); - text_cursor[0] -= UI_GLYPH_SPACING_X*scale; - - u8 glyph_base[2]; - u8 glyph_index = '\xb6'; - glyph_base[0] = glyph_index & 0xf; - glyph_base[1] = (glyph_index-glyph_base[0])>>4; - glyph_base[0] *= 8; - glyph_base[1] *= 8; - - ui_fill_rect( text_cursor, 0x00ffffff, (ui_px[4]) - { - glyph_base[0]+2, - glyph_base[1]+1, - glyph_base[0]+6, - glyph_base[1]+8 - }); - - text_cursor[0] += UI_GLYPH_SPACING_X*scale; + text_cursor[0] -= vg_ui.font->spacing*scale; + + ui_rect glyph; + ui_text_glyph( vg_ui.font, scale, '\xb6' /*FIXME*/, glyph ); + ui_fill_rect( text_cursor, 0x00ffffff, glyph ); + text_cursor[0] += vg_ui.font->spacing*scale; } if( c == '\n' ){ - text_cursor[1] += 14*scale; + text_cursor[1] += vg_ui.font->line_height*scale; text_cursor[0] = ui_text_aligned_x( _c, rect, scale, align ); printed_chars = 0; continue; } else if( c >= 33 ){ - u8 glyph_base[2]; - u8 glyph_index = c; - glyph_base[0] = glyph_index & 0xf; - glyph_base[1] = (glyph_index-glyph_base[0])>>4; - glyph_base[0] *= 8; - glyph_base[1] *= 8; - - ui_rect rect_char; - - if( ui_clip( rect, text_cursor, rect_char ) ){ - ui_fill_rect( rect_char, colour, (ui_px[4]) - { - glyph_base[0]+2, - glyph_base[1]+1, - glyph_base[0]+6, - glyph_base[1]+8 - }); + ui_rect glyph; + ui_text_glyph( vg_ui.font, scale, c, glyph ); + + ui_rect cursor_clipped; + if( ui_clip( rect, text_cursor, cursor_clipped ) ){ + ui_fill_rect( cursor_clipped, colour, glyph ); } } else if( c == '\x1B' ){ @@ -948,12 +940,12 @@ static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, continue; } else if( c == '\t' ){ - text_cursor[0] += UI_GLYPH_SPACING_X*scale*4; + text_cursor[0] += vg_ui.font->spacing*scale*4; printed_chars += 4; continue; } - text_cursor[0] += UI_GLYPH_SPACING_X*scale; + text_cursor[0] += vg_ui.font->spacing*scale; printed_chars ++; } @@ -961,13 +953,39 @@ static u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale, } static void ui_text( ui_rect rect, const char *str, ui_px scale, - enum ui_align align, u32 colour ) -{ + enum ui_align align, u32 colour ){ ui_ntext( rect, str, 1024, scale, align, colour ); } -static void ui_image( ui_rect rect, GLuint image ) -{ +/* + * Standard layout stuff + * ----------------------------------------------------------------------------- + */ + +static void ui_panel( ui_rect in_rect, ui_rect out_panel ){ + ui_fill( in_rect, ui_colour( k_ui_bg+1 ) ); + ui_outline( in_rect, 1, ui_colour( k_ui_bg+7 ), 0 ); + rect_copy( in_rect, out_panel ); + ui_rect_pad( out_panel, (ui_px[2]){ k_ui_padding, k_ui_padding } ); +} + +static void ui_label( ui_rect rect, const char *text, ui_px size, + ui_px gap, ui_rect r ){ + ui_rect l; + ui_px width = (ui_text_line_width(text)+vg_ui.font->spacing) * size; + ui_split( rect, k_ui_axis_v, width, gap, l, r ); + ui_text( l, text, 1, k_ui_align_middle_left, 0 ); +} + +static void ui_standard_widget( ui_rect inout_panel, ui_rect out_rect, + ui_px count ){ + ui_px height = (count * vg_ui.font->glyph_height + 18) * k_ui_scale; + ui_split( inout_panel, k_ui_axis_h, height, k_ui_padding, + out_rect, inout_panel ); +} + + +static void ui_image( ui_rect rect, GLuint image ){ ui_flush( k_ui_shader_colour ); glActiveTexture( GL_TEXTURE0 ); glBindTexture( GL_TEXTURE_2D, image ); @@ -975,8 +993,7 @@ static void ui_image( ui_rect rect, GLuint image ) ui_flush( k_ui_shader_image ); } -static u32 v4f_u32_colour( v4f colour ) -{ +static u32 v4f_u32_colour( v4f colour ){ u32 r = colour[0] * 255.0f, g = colour[1] * 255.0f, b = colour[2] * 255.0f, @@ -985,8 +1002,7 @@ static u32 v4f_u32_colour( v4f colour ) return r | (g<<8) | (b<<16) | (a<<24); } -static void ui_defocus_all(void) -{ +static void ui_defocus_all(void){ if( vg_ui.focused_control_type == k_ui_control_textbox ){ SDL_StopTextInput(); } @@ -1049,7 +1065,7 @@ static enum ui_button_state ui_colourbutton( ui_rect rect, } else{ ui_fill( rect, col_base ); - ui_outline( rect, 1, col_highlight ); + ui_outline( rect, 1, col_highlight, 0 ); return k_ui_button_holding_outside; } } @@ -1090,9 +1106,15 @@ static enum ui_button_state ui_button_text( ui_rect rect, return ui_colourbutton_text( rect, string, scale, k_ui_bg+4 ); } +static enum ui_button_state ui_button( ui_rect inout_panel, + const char *string ){ + ui_rect rect; + ui_standard_widget( inout_panel, rect, 1 ); + return ui_colourbutton_text( rect, string, 1, k_ui_bg+4 ); +} + static void ui_enum_post(void); -static void ui_postrender(void) -{ +static void ui_postrender(void){ if( vg_ui.click_fade_opacity > 0.0f ){ float scale = vg_ui.click_fade_opacity; scale = vg_maxf( 1.0f/255.0f, scale*scale ); @@ -1132,7 +1154,7 @@ static void ui_postrender(void) ui_rect_center( screen, box ); ui_fill( box, ui_colour(k_ui_bg) ); - ui_outline( box, -1, colour ); + ui_outline( box, -1, colour, 0 ); ui_rect message; rect_copy( box, message ); @@ -1141,8 +1163,8 @@ static void ui_postrender(void) ui_rect row0, row1, btn; ui_split_ratio( message, k_ui_axis_h, 0.5f, 0, row0, row1 ); - row0[0] += UI_GLYPH_SPACING_X; - ui_ntext( row0, vg_ui.modal.message, (box[2]/UI_GLYPH_SPACING_X)-2, 1, + row0[0] += vg_ui.font->spacing; + ui_ntext( row0, vg_ui.modal.message, (box[2]/vg_ui.font->spacing)-2, 1, k_ui_align_left, colour ); rect_copy( row1, btn ); @@ -1176,48 +1198,6 @@ static void ui_postrender(void) SDL_ShowCursor(1); } -static void ui_dev_colourview(void) -{ - ui_rect window = {vg.window_x-256,0,256,vg.window_y}, swatch; - - const char *names[vg_list_size(vg_ui.scheme)] = { - [k_ui_bg] = "k_ui_bg", "k_ui_bg+1", "k_ui_bg+2", "k_ui_bg+3", - "k_ui_bg+4", "k_ui_bg+5", "k_ui_bg+6", "k_ui_bg+7", - - [k_ui_fg] = "k_ui_fg", "k_ui_fg+1", "k_ui_fg+2", "k_ui_fg+3", - "k_ui_fg+4", "k_ui_fg+5", "k_ui_fg+6", "k_ui_fg+7", - - [k_ui_red] = "k_ui_red", "k_ui_orange", "k_ui_yellow", "k_ui_green", - "k_ui_aqua", "k_ui_blue", "k_ui_purple", "k_ui_gray", - "k_ui_red+8","k_ui_orange+8","k_ui_yellow+8","k_ui_green+8", - "k_ui_aqua+8","k_ui_blue+8","k_ui_purple+8","k_ui_gray+8" }; - - ui_rect col[2]; - ui_split_ratio( window, k_ui_axis_v, 0.5f, 0, col[0], col[1] ); - - for( int i=0; i 0 ); + assert( buf ); + + if( lines > 1 ) flags |= UI_TEXTBOX_MULTILINE; + + ui_rect rect; + ui_standard_widget( inout_panel, rect, lines ); + + if( label ) + ui_label( rect, label, 1, 0, rect ); + int clickup= ui_click_up(UI_MOUSE_LEFT), clickdown = ui_click_down(UI_MOUSE_LEFT), click = ui_clicking(UI_MOUSE_LEFT) | clickup, @@ -1743,7 +1744,7 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, rect_copy( rect, text_rect ); if( flags & UI_TEXTBOX_MULTILINE ) text_rect[3] = rect[3]-16; - else text_rect[3] = 14; + else text_rect[3] = vg_ui.font->line_height; text_rect[2] -= 16; ui_rect_center( rect, text_rect ); @@ -1751,7 +1752,7 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, ui_px wrap_length = 1024; if( flags & UI_TEXTBOX_WRAP ) - wrap_length = text_rect[2] / UI_GLYPH_SPACING_X; + wrap_length = text_rect[2] / vg_ui.font->spacing; if( hover ){ vg_ui.cursor = k_ui_cursor_ibeam; @@ -1768,13 +1769,13 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, vg_ui.focused_control_hit = 1; if( click && target ){ int p0[3] ={ - (vg_ui.mouse_click[0] - text_rect[0]) / UI_GLYPH_SPACING_X, - (vg_ui.mouse_click[1] - text_rect[1]) / 14, + (vg_ui.mouse_click[0] - text_rect[0]) / vg_ui.font->spacing, + (vg_ui.mouse_click[1] - text_rect[1]) / vg_ui.font->line_height, -1 }, p1[3] = { - (vg_ui.mouse[0] - text_rect[0]) / UI_GLYPH_SPACING_X, - (vg_ui.mouse[1] - text_rect[1]) / 14, + (vg_ui.mouse[0] - text_rect[0]) / vg_ui.font->spacing, + (vg_ui.mouse[1] - text_rect[1]) / vg_ui.font->line_height, -1 }; @@ -1792,7 +1793,7 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, } } - ui_outline( rect, -2, vg_ui.scheme[ k_ui_orange ] ); + ui_outline( rect, -2, vg_ui.scheme[ k_ui_orange ], 0 ); ui_rect cursor; @@ -1802,15 +1803,14 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, end = VG_MAX( c0, c1 ), chars = end-start; - if( flags & (UI_TEXTBOX_MULTILINE|UI_TEXTBOX_WRAP) ){ - + if( flags & (UI_TEXTBOX_WRAP|UI_TEXTBOX_MULTILINE) ){ int pos[3], remaining = chars; pos[2] = start; _ui_textbox_index_calc_coords( pos, wrap_length ); if( start==end ){ - cursor[0] = text_rect[0] + pos[0]*UI_GLYPH_SPACING_X-1; + cursor[0] = text_rect[0] + pos[0]*vg_ui.font->spacing-1; cursor[1] = text_rect[1] + pos[1]*14; cursor[2] = 2; cursor[3] = 13; @@ -1822,9 +1822,9 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, int run = _ui_textbox_run_remaining( pos, wrap_length ); run = VG_MIN( run, remaining ); - cursor[0] = text_rect[0] + pos[0]*UI_GLYPH_SPACING_X-1; + cursor[0] = text_rect[0] + pos[0]*vg_ui.font->spacing-1; cursor[1] = text_rect[1] + pos[1]*14; - cursor[2] = (float)(run)*(float)UI_GLYPH_SPACING_X; + cursor[2] = (float)(run)*(float)vg_ui.font->spacing; cursor[3] = 13; ui_fill( cursor, col_cursor ); @@ -1838,7 +1838,7 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, } } else{ - cursor[0] = text_rect[0] + start*UI_GLYPH_SPACING_X-1; + cursor[0] = text_rect[0] + start*vg_ui.font->spacing-1; cursor[1] = text_rect[1]; cursor[3] = 13; @@ -1846,7 +1846,7 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, cursor[2] = 2; } else{ - cursor[2] = (float)(chars)*(float)UI_GLYPH_SPACING_X; + cursor[2] = (float)(chars)*(float)vg_ui.font->spacing; } if( (vg_ui.click_fade_opacity<=0.0f) && @@ -1896,13 +1896,59 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags, ui_fill( rect, col_base ); if( hover ){ - ui_outline( rect, -1, col_highlight ); + ui_outline( rect, -1, col_highlight, 0 ); } ui_ntext( text_rect, buf, wrap_length, 1, k_ui_align_left, 0 ); return 0; } +/* + * Tabs + * ----------------------------------------------------------------------------- + */ + +static void ui_tabs( ui_rect inout_panel, ui_rect out_content_panel, + const char **titles, u32 count, i32 *page ){ + ui_rect bar; + ui_standard_widget( inout_panel, bar, 1 ); + + i32 cur_page = *page; + + f32 width = (f32)inout_panel[2] / (f32)count; + + ui_px h = (inout_panel[1] + inout_panel[3]) - (bar[1]+bar[3]); + inout_panel[1] = bar[1]+bar[3]; + inout_panel[3] = h; + + ui_fill( inout_panel, ui_colour( k_ui_bg+2 ) ); + ui_outline( inout_panel, 1, ui_colour( k_ui_bg+5 ), 0 ); + + rect_copy( inout_panel, out_content_panel ); + ui_rect_pad( out_content_panel, (ui_px[2]){ k_ui_padding, k_ui_padding } ); + + /* place buttons */ + for( i32 i=0; i