+ if( network_client.state == k_ESteamNetworkingConnectionState_Connected ){
+ ui_info( panel, "#-1: localplayer" );
+
+ snprintf( buf, 512, "U%.1f/D%.1fkbs",
+ netplayers.up_kbs, netplayers.down_kbs );
+ ui_info( panel, buf );
+
+ for( u32 i=0; i<vg_list_size(netplayers.list); i++ ){
+ struct network_player *player = &netplayers.list[i];
+ if( player->active ){
+ const char *sysname = "invalid";
+
+ if( player->subsystem < k_player_subsystem_max ){
+ sysname = player_subsystems[ player->subsystem ]->name;
+ }
+ snprintf( buf, 512, "#%u: %s [%s] D%.1fkbs",
+ i, player->username, sysname, player->down_kbs );
+ ui_info( panel, buf );
+
+ v4f wpos = { 0.0f, 2.0f, 0.0f, 1.0f };
+ struct player_avatar *av = localplayer.playeravatar;
+ m4x3_mulv( netplayers.final_mtx[av->sk.bone_count*i], wpos, wpos );
+ m4x4_mulv( pv, wpos, wpos );
+
+ if( wpos[3] > 0.0f ){
+ v2_muls( wpos, (1.0f/wpos[3]) * 0.5f, wpos );
+ v2_add( wpos, (v2f){ 0.5f, 0.5f }, wpos );
+
+ ui_rect wr;
+ wr[0] = vg_clampf(wpos[0] * vg.window_x, -32000.0f,32000.0f)-150;
+ wr[1] = vg_clampf((1.0f-wpos[1]) * vg.window_y,
+ -32000.0f,32000.0f);
+ wr[2] = 300;
+ wr[3] = 17;
+ ui_fill( wr, (ui_colour(k_ui_bg)&0x00ffffff)|0x50000000 );
+ ui_text( wr, buf, 1, k_ui_align_middle_center, 0 );
+ }
+ }
+ }
+ }
+ else {
+ ui_info( panel, "offline" );
+ }
+}
+
+static void pose_remote_player( u32 index,
+ struct interp_frame *f0,
+ struct interp_frame *f1 ){
+
+ struct interp_buffer *buf = &netplayers.interp_data[ index ];
+ struct player_avatar *av = localplayer.playeravatar;
+ struct skeleton *sk = &localplayer.playeravatar->sk;
+ m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*index ];
+
+ struct player_subsystem_interface *sys0 = player_subsystems[f0->subsystem],
+ *sys1 = NULL;
+
+ player_pose pose0, pose1, posed;
+
+ sys0->pose( &f0->data, &pose0 );
+
+ if( f1 ){
+ f32 t = (buf->t - f0->timestamp) / (f1->timestamp - f0->timestamp);
+ t = vg_clampf( t, 0.0f, 1.0f );