X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_sfd.c;h=478f431ee7aa01956d27746184d39d1ef506454c;hb=6ba5c35d106d749a1ebafbd3cbe18c3a02f781d3;hp=9fe2d68e76743060909b200e8ef97fc54152c0c3;hpb=342fcbf6fda017bdd38d56ce0fa7c9e59e589f3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_sfd.c b/world_sfd.c index 9fe2d68..478f431 100644 --- a/world_sfd.c +++ b/world_sfd.c @@ -4,9 +4,12 @@ #include "world_sfd.h" #include "shaders/scene_scoretext.h" #include "shaders/scene_vertex_blend.h" +#include "network.h" +#include "entity.h" +#include "network_common.h" +#include "world_routes.h" -static f32 sfd_encode_glyph( char c ) -{ +static f32 sfd_encode_glyph( char c ){ int value = 0; if( c >= 'a' && c <= 'z' ) value = c-'a'+11; @@ -39,8 +42,7 @@ static f32 sfd_encode_glyph( char c ) return (float)value; } -VG_STATIC void sfd_encode( u32 row, const char *str ) -{ +static void sfd_encode( u32 row, const char *str ){ int end=0; u32 row_h = world_sfd.h -1 -row; @@ -59,13 +61,126 @@ VG_STATIC void sfd_encode( u32 row, const char *str ) } } -VG_STATIC void sfd_update(void) -{ +static void world_sfd_compile_scores( struct leaderboard_cache *board ){ + for( u32 i=0; i<13; i++ ) + sfd_encode( i, "" ); + + if( !board ){ + sfd_encode( 4, "Error out of range" ); + return; + } + + if( !network_client.remote ){ + sfd_encode( 4, "Offline" ); + return; + } + + if( board->status == k_request_status_not_found ){ + sfd_encode( 4, "No records" ); + return; + } + + if( board->status != k_request_status_ok ){ + char buf[32]; + vg_str s; + vg_strnull( &s, buf, 32 ); + vg_strcat( &s, "Error: " ); + vg_strcati32( &s, board->status ); + sfd_encode( 4, buf ); + return; + } + + vg_msg body; + vg_msg_init( &body, board->data, board->data_len ); + + const char *alias = "rows"; + + if( world_sfd.view_weekly ){ + alias = "rows_weekly"; + sfd_encode( 0, "Weekly" ); + } + else { + sfd_encode( 0, "All-Time" ); + } + + u32 l = 1; + if( vg_msg_seekframe( &body, alias ) ){ + while( vg_msg_seekframe( &body, NULL ) ){ + const char *username = vg_msg_getkvstr( &body, "username" ); + + if( username ) + sfd_encode( l ++, username ); + else + sfd_encode( l ++, "UNKNOWN USER" ); + + vg_msg_skip_frame( &body ); + } + } + else { + sfd_encode( 4, "No records" ); + } +} + +static void world_sfd_compile_active_scores(void){ + world_instance *world = world_current_instance(); + + struct leaderboard_cache *board = NULL; + + if( world_sfd.active_route_board < mdl_arrcount( &world->ent_route ) ) + board = &world->leaderboard_cache[ world_sfd.active_route_board ]; + + world_sfd_compile_scores( board ); +} + +static void world_sfd_update( world_instance *world, v3f pos ){ + if( mdl_arrcount( &world->ent_route ) ){ + u32 closest = 0; + float min_dist = INFINITY; + + for( u32 i=0; ient_route ); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + float dist = v3_dist2( route->board_transform[3], pos ); + + if( dist < min_dist ){ + min_dist = dist; + closest = i; + } + } + + struct leaderboard_cache *board = &world->leaderboard_cache[ closest ]; + + /* request new board if cache expires */ + if( network_client.remote ){ + f64 delta = vg.time_real - board->cache_time; + if( (delta > 45.0) || (board->cache_time == 0.0) ){ + board->cache_time = vg.time_real; + ent_route *route = mdl_arritm( &world->ent_route, closest ); + addon_reg *world_reg = + world_static.instance_addons[ world - world_static.instances ]; + + char mod_uid[ ADDON_UID_MAX ]; + addon_alias_uid( &world_reg->alias, mod_uid ); + + network_request_scoreboard( + mod_uid, + mdl_pstr( &world->meta, route->pstr_name ), + NETWORK_LEADERBOARD_ALLTIME_AND_CURRENT_WEEK, closest ); + } + } + + /* compile board text if we changed. */ + if( world_sfd.active_route_board != closest ){ + world_sfd_compile_active_scores(); + } + + world_sfd.active_route_board = closest; + } + for( int i=0; i rate ){ @@ -78,20 +193,12 @@ VG_STATIC void sfd_update(void) } } -VG_STATIC void bind_terrain_noise(void); -VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform ) -{ +static void bind_terrain_noise(void); +static void sfd_render( world_instance *world, camera *cam, m4x3f transform ){ mesh_bind( &world_sfd.mesh_display ); shader_scene_scoretext_use(); shader_scene_scoretext_uTexMain(1); - - world_link_lighting_ub( world, _shader_scene_scoretext.id ); - world_bind_position_texture( world, _shader_scene_scoretext.id, - _uniform_scene_scoretext_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_scoretext.id, - _uniform_scene_scoretext_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_scoretext.id, - _uniform_scene_scoretext_uLightsIndex, 4 ); + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_scoretext ); bind_terrain_noise(); @@ -118,13 +225,8 @@ VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform ) shader_scene_vertex_blend_use(); shader_scene_vertex_blend_uTexGarbage(0); shader_scene_vertex_blend_uTexGradients(1); - world_link_lighting_ub( world, _shader_scene_vertex_blend.id ); - world_bind_position_texture( world, _shader_scene_vertex_blend.id, - _uniform_scene_vertex_blend_g_world_depth, 2 ); - world_bind_light_array( world, _shader_scene_vertex_blend.id, - _uniform_scene_vertex_blend_uLightsArray, 3 ); - world_bind_light_index( world, _shader_scene_vertex_blend.id, - _uniform_scene_vertex_blend_uLightsIndex, 4 ); + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_vertex_blend ); + bind_terrain_noise(); glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, world_sfd.tex_scoretex ); @@ -138,8 +240,7 @@ VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform ) mdl_draw_submesh( &world_sfd.sm_base ); } -VG_STATIC int world_sfd_test( int argc, const char *argv[] ) -{ +static int world_sfd_test( int argc, const char *argv[] ){ if( argc == 2 ){ int row = vg_min( vg_max(atoi(argv[0]),0), world_sfd.h); sfd_encode( row, argv[1] ); @@ -148,8 +249,7 @@ VG_STATIC int world_sfd_test( int argc, const char *argv[] ) return 0; } -VG_STATIC void world_sfd_init(void) -{ +static void world_sfd_init(void){ vg_info( "world_sfd_init\n" ); shader_scene_scoretext_register(); vg_console_reg_cmd( "sfd", world_sfd_test, NULL );