X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=menu.h;h=6df04dbf6da80e364b53f5fa6b94d7645d9be710;hb=e311bbe2fa903a7e2a922f202f389b799193195d;hp=dd2cf686d8b3cf286f29afeca822998fd2212240;hpb=342fcbf6fda017bdd38d56ce0fa7c9e59e589f3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/menu.h b/menu.h index dd2cf68..6df04db 100644 --- a/menu.h +++ b/menu.h @@ -5,24 +5,33 @@ #include "model.h" #include "world_render.h" #include "player.h" -#include "conf.h" #include "shaders/model_menu.h" #include "audio.h" #include "input.h" +#include "workshop.h" +#include "respawn.h" +#include "gui.h" +#include "ent_miniworld.h" #define MENU_STACK_SIZE 8 struct { - int active; - f32 factive; + int credits_open; int disable_open; u32 page, /* current page index */ - page_depth; + page_depth, + controls_page_id; + + ent_menuitem *ctr_kbm, + *ctr_deck, + *ctr_ps, + *ctr_steam, + *ctr_xbox; enum menu_input_mode{ - k_menu_input_mode_mouse, - k_menu_input_mode_keys + k_menu_input_mode_keys, + k_menu_input_mode_mouse } input_mode; f32 mouse_track, mouse_dist; /* used for waking up mouse */ @@ -50,8 +59,7 @@ static menu; /* * Attaches memory locations to the various items in the menu */ -static void menu_link(void) -{ +static void menu_link(void){ /* link data locations */ for( u32 i=0; ipvoid = NULL; } } + + /* link controllers */ + menu.ctr_deck = NULL; + menu.ctr_kbm = NULL; + menu.ctr_ps = NULL; + menu.ctr_steam = NULL; + menu.ctr_xbox = NULL; + + for( u32 i=0; ivisual.pstr_name, "deck" ) ) + menu.ctr_deck = item; + if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "kbm" ) ) + menu.ctr_kbm = item; + if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "ps" ) ) + menu.ctr_ps = item; + if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "steam" ) ) + menu.ctr_steam = item; + if( MDL_CONST_PSTREQ( &menu.model, item->visual.pstr_name, "xbox" ) ) + menu.ctr_xbox = item; + } +} + +static void menu_close(void){ + skaterift.activity = k_skaterift_default; + menu.page_depth = 0; + menu.page = 0xffffffff; + srinput.state = k_input_state_resume; } -static void menu_init(void) -{ +static void menu_init(void){ void *alloc = vg_mem.rtmemory; mdl_open( &menu.model, "models/rs_menu.mdl", alloc ); @@ -105,9 +141,9 @@ static void menu_init(void) vg_linear_clear( vg_mem.scratch ); - mdl_load_array( &menu.model, &menu.items, "ent_menuitem", alloc ); - mdl_load_array( &menu.model, &menu.markers, "ent_marker", alloc ); - mdl_load_array( &menu.model, &menu.cameras, "ent_camera", alloc ); + MDL_LOAD_ARRAY( &menu.model, &menu.items, ent_menuitem, alloc ); + MDL_LOAD_ARRAY( &menu.model, &menu.markers, ent_marker, alloc ); + MDL_LOAD_ARRAY( &menu.model, &menu.cameras, ent_camera, alloc ); vg_linear_clear( vg_mem.scratch ); @@ -118,7 +154,7 @@ static void menu_init(void) void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size ); mdl_fread_pack_file( &menu.model, &tex0->file, data ); - mdl_async_load_glmesh( &menu.model, &menu.mesh ); + mdl_async_load_glmesh( &menu.model, &menu.mesh, NULL ); vg_tex2d_load_qoi_async( data, tex0->file.pack_size, VG_TEX2D_LINEAR|VG_TEX2D_CLAMP, &menu.texture ); @@ -130,13 +166,10 @@ 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" ); +static void menu_back_page(void){ menu.page_depth --; if( menu.page_depth == 0 ){ - menu.active = 0; - menu.page = 0xffffffff; + menu_close(); } else{ menu.page = menu.page_stack[ menu.page_depth ].page; @@ -151,12 +184,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 ){ @@ -186,8 +228,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; } @@ -198,24 +238,36 @@ static void menu_open_page( const char *name ) /* * activate a pressable type */ -static void menu_trigger_item( ent_menuitem *item ) -{ +static void menu_trigger_item( ent_menuitem *item ){ if ( item->type == k_ent_menuitem_type_event_button ){ u32 q = item->button.pstr; if( MDL_CONST_PSTREQ( &menu.model, q, "quit" ) ){ vg.window_should_close = 1; } - else if( MDL_CONST_PSTREQ( &menu.model, q, "reset" ) ){ - localplayer_cmd_respawn( 0, NULL ); - - menu.page_depth = 0; - menu.active = 0; - menu.page = 0xffffffff; + + else if( MDL_CONST_PSTREQ( &menu.model, q, "map" ) ){ + + menu_close(); + respawn_begin_chooser(); + } + else if( MDL_CONST_PSTREQ( &menu.model, q, "hub" ) ){ + if( world_static.active_instance == k_world_purpose_client ){ + srinput.state = k_input_state_resume; + menu_close(); + ent_miniworld_goback(); + } + } + else if( MDL_CONST_PSTREQ( &menu.model, q, "credits" ) ){ + menu.credits_open = 1; + } + else if( MDL_CONST_PSTREQ( &menu.model, q, "workshop" ) ){ + workshop_submit_command(0,NULL); } } 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 ){ @@ -224,8 +276,7 @@ static void menu_trigger_item( ent_menuitem *item ) } } -static f32 menu_slider_snap( f32 value, f32 old, f32 notch ) -{ +static f32 menu_slider_snap( f32 value, f32 old, f32 notch ){ f32 const k_epsilon = 0.0125f; if( fabsf(notch-value) < k_epsilon ){ @@ -241,25 +292,38 @@ static f32 menu_slider_snap( f32 value, f32 old, f32 notch ) return value; } +static void menu_setitem_type( ent_menuitem *item, + enum ent_menuitem_type type ){ + if( !item ) return; + item->type = type; +} + /* * Run from vg_gui every frame */ -static void menu_update(void) -{ +static void menu_update(void){ + if( workshop_form.page != k_workshop_form_hidden ){ + return; + } + + int escape = button_down( k_srbind_mback ); + if( menu.credits_open ){ + if( escape ){ + menu.credits_open = 0; + } + return; + } + if( button_down( k_srbind_mopen ) ){ - if( !menu.active && !menu.disable_open ){ - menu.active = 1; + 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; } } - menu.factive = vg_lerpf( menu.factive, menu.active, - vg.time_frame_delta * 6.0f ); - - if( !menu.active ) return; - + if( skaterift.activity != k_skaterift_menu ) return; enum menu_input_mode prev_mode = menu.input_mode; /* get buttons inputs @@ -270,8 +334,7 @@ static void menu_update(void) md = button_down( k_srbind_mdown ), mh = ml-mr, mv = mu-md, - enter = button_down( k_srbind_maccept ), - escape = button_down( k_srbind_mback ); + enter = button_down( k_srbind_maccept ); if( mh||mv||enter ){ menu.input_mode = k_menu_input_mode_keys; @@ -362,7 +425,9 @@ static void menu_update(void) ent_menuitem *item = mdl_arritm( &menu.items, i ); 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_visual) || + (item->type == k_ent_menuitem_type_visual_nocol) ) continue; + if( item->type == k_ent_menuitem_type_binding ) continue; if( !(item->groups & (0x1<type != k_ent_menuitem_type_page) && (item->type != k_ent_menuitem_type_visual) && + (item->type != k_ent_menuitem_type_visual_nocol) && (item->groups & (0x1<transform, (v3f){0.0f,-1.0f,0.0f}, v0 ); - player_vector_angles( target.angles, v0, 1.0f, 0.0f ); + v3_angles( v0, target.angles ); camera_lerp( &menu.view, &target, rate, &menu.view ); @@ -544,12 +666,25 @@ VG_STATIC void menu_render(void) ui_hex_to_norm( ui_colour( k_ui_fg ), white ); ui_hex_to_norm( ui_colour( k_ui_orange+k_ui_brighter ), blue ); + ent_menuitem *text_list[ 8 ]; + u32 text_count = 0; + for( u32 i=0; itype == k_ent_menuitem_type_disabled ) continue; if( item->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 ){ @@ -564,10 +699,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_nocol ){ + 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; @@ -605,6 +745,58 @@ 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, k_font_shader_default, 0, NULL, &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( variant, buf ); + + local[3][0] = -0.5f * offset; + m4x3_mul( transform, local, transform ); + + font3d_simple_draw( variant, buf, &menu.view, transform ); + } +} + +static void menu_binding_string( char buf[128], u32 pstr ){ + vg_str str; + vg_strnull( &str, buf, 128 ); + + if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_jump" ) ){ + vg_input_string( &str, input_button_list[k_srbind_jump], 1 ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick0" ) ){ + vg_strcat( &str, "SHUVIT " ); + vg_input_string( &str, input_button_list[k_srbind_trick0], 1 ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick1" ) ){ + vg_strcat( &str, "KICKFLIP " ); + vg_input_string( &str, input_button_list[k_srbind_trick1], 1 ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_trick2" ) ){ + vg_strcat( &str, "TREFLIP " ); + vg_input_string( &str, input_button_list[k_srbind_trick2], 1 ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_grab" ) ){ + vg_input_string( &str, input_axis_list[k_sraxis_grab], 1 ); + } + else if( MDL_CONST_PSTREQ( &menu.model, pstr, "bind_grab_mod" ) ){ + vg_input_string( &str, input_joy_list[k_srjoystick_grab], 1 ); + } + else + vg_strcat( &str, "error" ); } #endif /* MENU_H */