X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=menu.h;fp=menu.h;h=fa2d5812dd5a31c4892b76a9015f7733105d1eff;hb=53597f45307d8a2120e3a0bbe71797b216e8750b;hp=2071440c365c2bd24a89ab102deb59a94e819e57;hpb=f252ecb6f870260e0e944579ef732b94d1ed0ebe;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/menu.h b/menu.h index 2071440..fa2d581 100644 --- a/menu.h +++ b/menu.h @@ -10,6 +10,7 @@ #include "input.h" #include "workshop.h" #include "respawn.h" +#include "gui.h" #define MENU_STACK_SIZE 8 @@ -165,7 +166,6 @@ static void menu_init(void){ * Drop back a page until we're at the bottom which then we jus quit */ static void menu_back_page(void){ - vg_info( "menu_back_page()\n" ); menu.page_depth --; if( menu.page_depth == 0 ){ menu_close(); @@ -183,11 +183,16 @@ static void menu_back_page(void){ /* * Open page to the string identifier */ -static void menu_open_page( const char *name ){ - if( menu.page_depth >= MENU_STACK_SIZE ) - vg_fatal_error( "Stack overflow\n" ); - - vg_info( "Try to open %s\n", name ); +static void menu_open_page( const char *name, + enum ent_menuitem_stack_behaviour stackmode ){ + if( stackmode == k_ent_menuitem_stack_append ){ + if( menu.page_depth >= MENU_STACK_SIZE ) + vg_fatal_error( "Stack overflow\n" ); + } + else{ + if( menu.page_depth == 0 ) + vg_fatal_error( "Stack underflow\n" ); + } u32 hash = vg_strdjb2( name ); for( u32 i=0; igroups ); if( new_page == menu.page ){ - menu_back_page(); + if( stackmode != k_ent_menuitem_stack_replace ) + menu_back_page(); } else{ - menu.page_stack[ menu.page_depth ].page = menu.page; - menu.page_stack[ menu.page_depth ].cam = menu.cam; - menu.page_stack[ menu.page_depth ++ ].loc = menu.loc; + menu.page_stack[ menu.page_depth ].page = menu.page; + menu.page_stack[ menu.page_depth ].cam = menu.cam; + menu.page_stack[ menu.page_depth ].loc = menu.loc; + + if( stackmode == k_ent_menuitem_stack_append ) + menu.page_depth ++; + menu.page = __builtin_ctz( item->groups ); if( menu.input_mode == k_menu_input_mode_keys ){ @@ -217,8 +227,6 @@ static void menu_open_page( const char *name ){ u32 id = mdl_entity_id_id( item->page.id_viewpoint ); menu.cam = mdl_arritm( &menu.cameras, id ); } - vg_info( "menu page: %u (%p,%p)\n", - menu.page, menu.loc, menu.cam ); } return; } @@ -263,7 +271,8 @@ static void menu_trigger_item( ent_menuitem *item ){ } } else if( item->type == k_ent_menuitem_type_page_button ){ - menu_open_page( mdl_pstr( &menu.model, item->button.pstr ) ); + menu_open_page( mdl_pstr( &menu.model, item->button.pstr ), + item->button.stack_behaviour ); } else if( item->type == k_ent_menuitem_type_toggle ){ if( item->pi32 ){ @@ -314,7 +323,7 @@ static void menu_update(void){ if( skaterift.activity == k_skaterift_default ){ skaterift.activity = k_skaterift_menu; menu.page = 0xffffffff; - menu_open_page( "Main Menu" ); + menu_open_page( "Main Menu", k_ent_menuitem_stack_append ); return; } } @@ -422,6 +431,7 @@ static void menu_update(void){ if( item->type == k_ent_menuitem_type_page ) continue; if( item->type == k_ent_menuitem_type_visual ) continue; + if( item->type == k_ent_menuitem_type_binding ) continue; if( !(item->groups & (0x1<type == k_ent_menuitem_type_page ) continue; if( !(item->groups & (0x1 << menu.page)) ) continue; + if( item->type == k_ent_menuitem_type_binding ){ + if( text_count < vg_list_size(text_list) ) + text_list[ text_count ++ ] = item; + else + vg_fatal_error( "Text list overflow" ); + + continue; + } + int selected = 0; if( menu.loc ){ @@ -683,10 +707,15 @@ VG_STATIC void menu_render(void){ } } - item->factive = vg_lerpf( item->factive, selected, rate ); - v4f colour; - v4_lerp( white, blue, item->factive, colour ); - shader_model_menu_uColour( colour ); + if( item->type == k_ent_menuitem_type_visual ){ + shader_model_menu_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); + } + else{ + v4f colour; + item->factive = vg_lerpf( item->factive, selected, rate ); + v4_lerp( white, blue, item->factive, colour ); + shader_model_menu_uColour( colour ); + } f32 scale = 1.0f+item->factive*0.1f; @@ -724,6 +753,65 @@ VG_STATIC void menu_render(void){ mdl_draw_submesh( mdl_arritm( &menu.model.submeshs, index )); } } + + if( !text_count ) return; + + char buf[ 128 ]; + + m4x3f local; + m4x3_identity( local ); + + font3d_bind( &gui.font, &menu.view ); + for( u32 i=0; itransform, transform ); + + u32 variant = item->binding.font_variant; + menu_binding_string( buf, item->binding.pstr_bind ); + f32 offset = font3d_string_width( &gui.font, variant, buf ); + + local[3][0] = -0.5f * offset; + m4x3_mul( transform, local, transform ); + + font3d_simple_draw( &gui.font, variant, k_font_shader_default, buf, + &menu.view, transform ); + } +} + +VG_STATIC void menu_binding_string( char buf[128], u32 pstr ){ + vg_strncpy( "error", buf, 128, k_strncpy_allow_cutoff ); + + if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_jump" ) ){ + vg_strncpy( button_display_string(k_srbind_jump), buf, 128, + k_strncpy_allow_cutoff ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick0" ) ){ + vg_str str; + vg_strnull( &str, buf, 128 ); + vg_strcat( &str, "SHUVIT " ); + vg_strcat( &str, button_display_string(k_srbind_trick0) ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick1" ) ){ + vg_str str; + vg_strnull( &str, buf, 128 ); + vg_strcat( &str, "KICKFLIP " ); + vg_strcat( &str, button_display_string(k_srbind_trick1) ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick2" ) ){ + vg_str str; + vg_strnull( &str, buf, 128 ); + vg_strcat( &str, "TREFLIP " ); + vg_strcat( &str, button_display_string(k_srbind_trick2) ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_grab" ) ){ + vg_strncpy( axis_display_string(k_sraxis_grab), buf, 128, + k_strncpy_allow_cutoff ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_grab_mod" ) ){ + vg_strncpy( joystick_display_string(k_srjoystick_grab, 2), buf, 128, + k_strncpy_allow_cutoff ); + } } #endif /* MENU_H */