X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=gui.h;h=a0de270db36cb7f9dbb0991c7b71fb9d70839a15;hb=refs%2Fheads%2Fmenu2;hp=2ec0a5070afb4640cdf97d3fbef2e8178a9c896e;hpb=223e75026f958029f9664380ed20a5daa3ee2ae7;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/gui.h b/gui.h index 2ec0a50..3823c15 100644 --- a/gui.h +++ b/gui.h @@ -1,23 +1,98 @@ -#ifndef GUI_H -#define GUI_H - +#pragma once #include "font.h" +#include "input.h" +#include "player.h" +#include "vg/vg_engine.h" +#include "vg/vg_ui/imgui.h" + +#define GUI_COL_DARK ui_opacity( 0x00000000, 0.7f ) +#define GUI_COL_NORM ui_opacity( 0x00101010, 0.7f ) +#define GUI_COL_ACTIVE ui_opacity( 0x00444444, 0.7f ) +#define GUI_COL_CLICK ui_opacity( 0x00858585, 0.7f ) +#define GUI_COL_HI ui_opacity( 0x00ffffff, 0.8f ) + +enum gui_icon { + k_gui_icon_tick = 0, + k_gui_icon_tick_2d, + k_gui_icon_exclaim, + k_gui_icon_exclaim_2d, + k_gui_icon_board, + k_gui_icon_world, + k_gui_icon_rift, + k_gui_icon_rift_run, + k_gui_icon_rift_run_2d, + k_gui_icon_friend, + k_gui_icon_player, + k_gui_icon_rift_run_gold, + k_gui_icon_rift_run_silver, + k_gui_icon_glider, + k_gui_icon_spawn, + k_gui_icon_spawn_select, + + k_gui_icon_count, +}; + +#define GUI_HELPER_TEXT_LENGTH 32 struct{ struct gui_helper{ - const char *bindstr, *text; + vg_input_op *binding; + char text[GUI_HELPER_TEXT_LENGTH]; + int greyed; } helpers[4]; u32 helper_count; - float factive; + int active_positional_helper; + + struct icon_call { + enum gui_icon icon; + v4f location; + v4f colour; + int colour_changed; + } + icon_draw_buffer[64]; + u32 icon_draw_count; + v4f cur_icon_colour; + int colour_changed; + + char location[64]; + f64 location_time; + + f32 factive; + font3d font; + + v3f trick_co; + + mdl_context model_icons; + GLuint icons_texture; + glmesh icons_mesh; + + mdl_submesh *icons[ k_gui_icon_count ]; +} +static gui = {.cur_icon_colour = {1.0f,1.0f,1.0f,1.0f},.colour_changed=1}; + +static void gui_helper_clear(void){ + gui.helper_count = 0; + gui.active_positional_helper = 0; } -static gui; -VG_STATIC -void gui_draw(void) +static struct gui_helper *gui_new_helper( vg_input_op *bind, vg_str *out_text ){ + if( gui.helper_count >= vg_list_size(gui.helpers) ){ + vg_error( "Too many helpers\n" ); + return NULL; + } + + struct gui_helper *helper = &gui.helpers[ gui.helper_count ++ ]; + helper->greyed = 0; + helper->binding = bind; + vg_strnull( out_text, helper->text, sizeof(helper->text) ); + return helper; +} + +static void gui_render_icons(void) { - camera ortho; + vg_camera ortho; float fl = 0.0f, fr = vg.window_x, @@ -33,74 +108,253 @@ void gui_draw(void) ortho.mtx.p[3][1] = (ft + fb) * -tb; ortho.mtx.p[3][3] = 1.0f; m4x3_identity( ortho.transform ); - camera_update_view( &ortho ); - camera_finalize( &ortho ); + vg_camera_update_view( &ortho ); + m4x4_mul( ortho.mtx.p, ortho.mtx.v, ortho.mtx.pv ); /* HACK */ + vg_camera_finalize( &ortho ); - gui.factive = vg_lerpf( gui.factive, gui.helper_count?1.0f:0.0f, - vg.time_delta*2.0f ); - - if( gui.factive > 0.01f ){ - /* draw bottom bar */ - glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - glBlendEquation(GL_FUNC_ADD); - - shader_blitcolour_use(); - shader_blitcolour_uColour( (v4f){ 0.0f, 0.0f, 0.0f, gui.factive*0.8f } ); - render_fsquad1(); + /* icons */ + font3d_bind( &gui.font, k_font_shader_default, 0, NULL, &ortho ); + mesh_bind( &gui.icons_mesh ); + + m4x3f mmdl; + m4x3_identity( mmdl ); + shader_model_font_uMdl( mmdl ); + + glActiveTexture( GL_TEXTURE0 ); + glBindTexture( GL_TEXTURE_2D, gui.icons_texture ); + shader_model_font_uTexMain( 0 ); + + for( u32 i=0; icolour_changed ) + shader_model_font_uColour( call->colour ); + + shader_model_font_uOffset( call->location ); + + mdl_submesh *sm = gui.icons[ call->icon ]; + if( sm ) + mdl_draw_submesh( sm ); } - font3d *font = &world_global.font; - font3d_bind( font, &ortho ); + gui.icon_draw_count = 0; +} - float dy = ft/0.79f, - scale = dy*0x1p-4f*0.75f; +static void gui_draw( ui_context *ctx ) +{ + if( gui.active_positional_helper && + (v3_dist2(localplayer.rb.co,gui.trick_co) > 2.0f) ) + gui_helper_clear(); - m4x3f mmdl; - v4f q; - m3x3_identity( mmdl ); - m3x3_scale( mmdl, (v3f){scale,scale,scale} ); - v3_zero( mmdl[3] ); + /* helpers + * ----------------------------------------------------------------- */ - float pad = dy*0x1p-4f*0.125f; - mmdl[3][0] = pad*2.0f; - mmdl[3][1] = pad; + gui.factive = vg_lerpf( gui.factive, gui.helper_count?1.0f:0.0f, + vg.time_frame_delta*2.0f ); + + ctx->font = &vgf_default_title; + ui_px height = ctx->font->ch + 16; + ui_rect lwr = { 0, vg.window_y - height, vg.window_x, height }; - for( u32 i=0; ibinding, 1 ); + + ui_rect box = { x, lwr[1], 1000, lwr[3] }; + + u32 fg = 0; + f32 opacity = 0.4f; + if( helper->greyed ) + { + fg = ui_colour(ctx, k_ui_fg+2); + opacity = 0.1f; + } - struct font3d_render render; - font3d_begin( font, 2, &ortho, mmdl, &render ); + struct ui_vert *bg = ui_fill( ctx, box, + ui_opacity( GUI_COL_DARK, opacity ) ); - render.u8pch = (u8*)helper->bindstr; - font3d_draw( &render ); + u32 w; + box[0] += 16; + w = ui_text( ctx, box, buf, 1, k_ui_align_middle_left, fg ); + w *= ctx->font->sx; + bg[1].co[0] = x + w + 32; + bg[2].co[0] = x + w + 32; + x += w + 32; - const char *make_smaller = "\x02\xaf\x03 "; - render.u8pch = (const u8*)make_smaller; - font3d_draw( &render ); + box[0] = x; + bg = ui_fill( ctx, box, ui_opacity( GUI_COL_NORM, opacity*0.7f ) ); + box[0] += 8; + w = ui_text( ctx, box, helper->text, 1, k_ui_align_middle_left, fg ); + w *= ctx->font->sx; + bg[1].co[0] = box[0] + w + 16; + bg[2].co[0] = box[0] + w + 16; + x += w + 32; + } - render.u8pch = (u8*)helper->text; - font3d_draw( &render ); - - float w = render.offset[0]+1.0f; - mmdl[3][0] += w*scale; + vg_ui.frosting = gui.factive*0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + + + f64 loc_t = (vg.time_real - gui.location_time) / 5.0; + if( (loc_t < 1.0) && (gui.location_time != 0.0) ) + { + f32 t = 1.0f-vg_minf(1.0f,vg_minf(loc_t*20.0f,2.0f-loc_t*2.0f)), + o = 1.0f-t*t*(2.0f-t); + + ui_rect box = { 0, (vg.window_y*2)/3 - height/2, vg.window_x, height }; + ui_fill( ctx, box, ui_opacity( GUI_COL_NORM, 0.5f ) ); + ui_text( ctx, box, gui.location, 1, k_ui_align_middle_center, 0 ); + + vg_ui.colour[3] = o; + ui_flush( ctx, k_ui_shader_colour, NULL ); } - gui.helper_count = 0; + vg_ui.colour[3] = 1.0f; + ctx->font = &vgf_default_small; } -VG_STATIC -void gui_helper_action( const char *bindstr, const char *text ) +static int gui_location_print_ccmd( int argc, const char *argv[] ) { - if( gui.helper_count >= vg_list_size(gui.helpers) ) - vg_fatal_error( "Too many helpers\n" ); + if( argc > 0 ) + { + char new_loc[64]; + vg_str str; + vg_strnull( &str, new_loc, 64 ); + for( int i=0; ibindstr = bindstr; - helper->text = text; +static int gui_showtrick_ccmd( int argc, const char *argv[] ) +{ + if( argc == 1 ) + { + gui_helper_clear(); + vg_str text; + + if( !strcmp( argv[0], "pump" ) ){ + if( gui_new_helper( input_axis_list[k_sraxis_grab], &text ) ) + vg_strcat( &text, "Pump" ); + } + else if( !strcmp( argv[0], "flip" ) ){ + if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) ) + vg_strcat( &text, "Flip" ); + } + else if( !strcmp( argv[0], "ollie" ) ){ + if( gui_new_helper( input_button_list[k_srbind_jump], &text ) ) + vg_strcat( &text, "Ollie" ); + } + else if( !strcmp( argv[0], "trick" ) ){ + if( gui_new_helper( input_button_list[k_srbind_trick0], &text ) ) + vg_strcat( &text, "Shuvit" ); + if( gui_new_helper( input_button_list[k_srbind_trick1], &text ) ) + vg_strcat( &text, "Kickflip" ); + if( gui_new_helper( input_button_list[k_srbind_trick2], &text ) ) + vg_strcat( &text, "Tre-Flip" ); + } + else if( !strcmp( argv[0], "misc" ) ){ + if( gui_new_helper( input_button_list[k_srbind_camera], &text ) ) + vg_strcat( &text, "Camera" ); + if( gui_new_helper( input_button_list[k_srbind_use], &text ) ) + vg_strcat( &text, "Skate/Walk" ); + } + else return 1; + + v3_copy( localplayer.rb.co, gui.trick_co ); + gui.active_positional_helper = 1; + return 0; + } + return 1; } -#endif /* GUI_H */ +static void gui_draw_icon( enum gui_icon icon, v2f co, f32 size ) +{ + if( gui.icon_draw_count == vg_list_size(gui.icon_draw_buffer) ) + return; + + struct icon_call *call = &gui.icon_draw_buffer[ gui.icon_draw_count ++ ]; + + call->icon = icon; + call->location[0] = co[0] * (f32)vg.window_x; + call->location[1] = co[1] * (f32)vg.window_y; + call->location[2] = 0.0f; + call->location[3] = size * (f32)vg.window_x; + + v4_copy( gui.cur_icon_colour, call->colour ); + call->colour_changed = gui.colour_changed; + gui.colour_changed = 0; +} + +static void gui_icon_setcolour( v4f colour ){ + gui.colour_changed = 1; + v4_copy( colour, gui.cur_icon_colour ); +} + +static mdl_submesh *gui_find_icon( const char *name ){ + mdl_mesh *mesh = mdl_find_mesh( &gui.model_icons, name ); + if( mesh ){ + if( mesh->submesh_count ){ + return mdl_arritm( &gui.model_icons.submeshs, mesh->submesh_start ); + } + } + + return NULL; +} + +static void gui_init(void) +{ + font3d_load( &gui.font, "models/rs_font.mdl", vg_mem.rtmemory ); + vg_console_reg_cmd( "gui_location", gui_location_print_ccmd, NULL ); + vg_console_reg_cmd( "showtrick", gui_showtrick_ccmd, NULL ); + + /* load icons */ + void *alloc = vg_mem.rtmemory; + mdl_open( &gui.model_icons, "models/rs_icons.mdl", alloc ); + mdl_load_metadata_block( &gui.model_icons, alloc ); + + gui.icons[ k_gui_icon_tick ] = gui_find_icon( "icon_tick" ); + gui.icons[ k_gui_icon_tick_2d ] = gui_find_icon( "icon_tick2d" ); + gui.icons[ k_gui_icon_exclaim ] = gui_find_icon( "icon_exclaim" ); + gui.icons[ k_gui_icon_exclaim_2d ] = gui_find_icon( "icon_exclaim2d" ); + gui.icons[ k_gui_icon_board ] = gui_find_icon( "icon_board" ); + gui.icons[ k_gui_icon_world ] = gui_find_icon( "icon_world" ); + gui.icons[ k_gui_icon_rift ] = gui_find_icon( "icon_rift" ); + gui.icons[ k_gui_icon_rift_run ] = gui_find_icon( "icon_rift_run" ); + gui.icons[ k_gui_icon_rift_run_2d ] = gui_find_icon( "icon_rift_run2d" ); + gui.icons[ k_gui_icon_friend ] = gui_find_icon( "icon_friend" ); + gui.icons[ k_gui_icon_player ] = gui_find_icon( "icon_player" ); + gui.icons[ k_gui_icon_glider ] = gui_find_icon( "icon_glider" ); + gui.icons[ k_gui_icon_spawn ] = gui_find_icon( "icon_spawn" ); + gui.icons[ k_gui_icon_spawn_select ] = gui_find_icon( "icon_spawn_select" ); + gui.icons[ k_gui_icon_rift_run_gold ] = + gui_find_icon("icon_rift_run_medal_gold"); + gui.icons[ k_gui_icon_rift_run_silver]= + gui_find_icon("icon_rift_run_medal_silver"); + + vg_linear_clear( vg_mem.scratch ); + if( !mdl_arrcount( &gui.model_icons.textures ) ) + vg_fatal_error( "No texture in menu file" ); + mdl_texture *tex0 = mdl_arritm( &gui.model_icons.textures, 0 ); + void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size ); + mdl_fread_pack_file( &gui.model_icons, &tex0->file, data ); + vg_tex2d_load_qoi_async( data, tex0->file.pack_size, + VG_TEX2D_LINEAR|VG_TEX2D_CLAMP, + &gui.icons_texture ); + + mdl_async_load_glmesh( &gui.model_icons, &gui.icons_mesh, NULL ); + mdl_close( &gui.model_icons ); +}