interp test 1
[carveJwlIkooP6JGAAIwe30JlM.git] / world_sfd.c
index 9fe2d68e76743060909b200e8ef97fc54152c0c3..d960b0d54ad5a4221c8d69c0e0f1a39e3be16542 100644 (file)
@@ -39,7 +39,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,8 +59,43 @@ VG_STATIC void sfd_encode( u32 row, const char *str )
    }
 }
 
-VG_STATIC void sfd_update(void)
-{
+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; i<mdl_arrcount( &world->ent_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;
+         }
+      }
+
+      if( (world_sfd.active_route_board != closest) || network_scores_updated )
+      {
+         network_scores_updated = 0;
+         world_sfd.active_route_board = closest;
+
+         ent_route *route = mdl_arritm( &world->ent_route, closest );
+         u32 id = route->official_track_id;
+
+         if( id != 0xffffffff ){
+            struct netmsg_board *local_board = 
+               &scoreboard_client_data.boards[id];
+
+            for( int i=0; i<13; i++ ){
+               sfd_encode( i, &local_board->data[27*i] );
+            }
+         }else{
+            sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) );
+            sfd_encode( 1, "No data" );
+         }
+      }
+   }
+
    for( int i=0; i<world_sfd.w*world_sfd.h; i++ ){
       float *target = &world_sfd.buffer[i*2+0],
             *cur =    &world_sfd.buffer[i*2+1];
@@ -78,8 +113,8 @@ 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();
@@ -138,7 +173,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);
@@ -148,7 +183,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();