refactor network packets
[carveJwlIkooP6JGAAIwe30JlM.git] / player_remote.c
index dc133b25f0454e34deabf12fc019d8671c73eae6..b51c857e61ba16122f08af53dd23d71ef1af6d88 100644 (file)
@@ -1,6 +1,7 @@
 #include "player_remote.h"
 #include "skeleton.h"
 #include "player_render.h"
+#include "network_common.h"
 
 static void player_remote_unwatch( struct network_player *player ){
    addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot );
@@ -14,14 +15,6 @@ static void player_remote_clear( struct network_player *player ){
    player->subsystem = k_player_subsystem_invalid;
 }
 
-static void player_remote_clear_interp( u32 index ){
-   struct interp_buffer *buf = &netplayers.interp_data[ index ];
-   buf->t = -99999999.9;
-   for( u32 i=0; i<vg_list_size(buf->frames); i ++ ){
-      buf->frames[i].active = 0;
-   }
-}
-
 static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
    netmsg_blank *tmp = msg->m_pData;
 
@@ -37,13 +30,21 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
          /* TODO: interpret the uids */
          player->board_view_slot = 0;
          player->playermodel_view_slot = 0;
-         player_remote_clear_interp( playerjoin->index );
-
-         vg_strncpy( playerjoin->username, player->username, 
-                     sizeof(player->username), k_strncpy_always_add_null );
+#if 0
+            addon_cache_create_viewer_from_uid( k_addon_type_board, 
+                                                playerjoin->board_uid );
+         player->playermodel_view_slot = 
+            addon_cache_create_viewer_from_uid( k_addon_type_player,
+                                                playerjoin->playermodel_uid );
+#endif
+
+         struct interp_buffer *buf = &netplayers.interp_data[playerjoin->index];
+         buf->t = -99999999.9;
+         for( u32 i=0; i<vg_list_size(buf->frames); i ++ ){
+            buf->frames[i].active = 0;
+         }
 
-         vg_info( "#%u joined with name: %s\n", 
-                  playerjoin->index, player->username );
+         vg_info( "#%u joined\n", playerjoin->index );
       }
       else {
          vg_error( "inetmsg_playerjoin: player index out of range\n" );
@@ -69,10 +70,11 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
 
       if( update->index < vg_list_size(netplayers.list) ){
          struct network_player *player = &netplayers.list[ update->index ];
-         vg_strncpy( update->username, player->username, 
-                     sizeof(player->username), k_strncpy_always_add_null );
 
-         vg_info( "#%u changed username: %s\n", player->username );
+         network_msgstring( update->name, msg->m_cbSize, sizeof(*update),
+                            player->username, sizeof(player->username) );
+
+         vg_info( "#%u changed username to: %s\n", player->username );
       }
       else {
          vg_error( "inetmsg_playerleave: player index out of range\n" );
@@ -126,6 +128,9 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
    }
 }
 
+/*
+ * Write localplayer pose to network
+ */
 static void remote_player_send_playerframe(void){
    u8 sysid = localplayer.subsystem;
    if( sysid >= k_player_subsystem_max ) return;
@@ -150,6 +155,9 @@ static void remote_player_send_playerframe(void){
    }
 }
 
+/*
+ * Updates network traffic stats
+ */
 static void remote_player_debug_update(void){
    if( (vg.time_real - netplayers.last_data_measurement) > 1.0 ){
       netplayers.last_data_measurement = vg.time_real;
@@ -170,6 +178,9 @@ static void remote_player_debug_update(void){
    }
 }
 
+/*
+ * Debugging information
+ */
 static void remote_player_network_imgui( m4x4f pv ){
    if( !network_client.network_info ) 
       return;
@@ -253,6 +264,9 @@ static void remote_player_network_imgui( m4x4f pv ){
    }
 }
 
+/*
+ * write the remote players final_mtx 
+ */
 static void pose_remote_player( u32 index, 
                                 struct interp_frame *f0,
                                 struct interp_frame *f1 ){
@@ -276,20 +290,7 @@ static void pose_remote_player( u32 index,
       sys1 = player_subsystems[f1->subsystem];
       sys1->pose( &f1->data, &pose1 );
 
-      if( pose0.type != pose1.type ){
-         /* it would be nice to apply IK pass in-keyframes. TOO BAD! */
-         skeleton_copy_pose( sk, pose0.keyframes, posed.keyframes );
-      }
-      else {
-         skeleton_lerp_pose( sk, pose0.keyframes, pose1.keyframes, t, 
-                             posed.keyframes );
-      }
-
-      v3_lerp( pose0.root_co, pose1.root_co, t, posed.root_co );
-      q_nlerp( pose0.root_q,  pose1.root_q,  t, posed.root_q );
-      posed.type = pose0.type;
-      posed.board.lean = vg_lerpf( pose0.board.lean, pose1.board.lean, t );
-
+      lerp_player_pose( &pose0, &pose1, t, &posed );
       apply_full_skeleton_pose( &av->sk, &posed, final_mtx );
    }
    else {
@@ -297,8 +298,14 @@ static void pose_remote_player( u32 index,
    }
 }
 
+/* 
+ * animate remote player and store in final_mtx
+ */
 static void animate_remote_player( u32 index ){
 
+   /*
+    * Trys to keep the cursor inside the buffer
+    */
    f64 min_time = -999999999.9,
        max_time =  999999999.9,
        abs_max_time = -999999999.9;
@@ -342,3 +349,31 @@ static void animate_remote_player( u32 index ){
          return;
    }
 }
+
+/*
+ * Update full final_mtx for all remote players
+ */
+static void animate_remote_players(void){
+   for( u32 i=0; i<vg_list_size(netplayers.list); i ++ ){
+      struct network_player *player = &netplayers.list[i];
+      if( !player->active ) continue;
+
+      animate_remote_player( i );
+   }
+}
+
+/*
+ * Draw remote players
+ */
+static void render_remote_players( world_instance *world, camera *cam ){
+   for( u32 i=0; i<vg_list_size(netplayers.list); i ++ ){
+      struct network_player *player = &netplayers.list[i];
+      if( !player->active ) continue;
+      
+      struct player_avatar *av = localplayer.playeravatar;
+
+      struct player_model *model = &localplayer.fallback_model;
+      render_playermodel( cam, world, 0, model, &av->sk,
+                          &netplayers.final_mtx[ av->sk.bone_count*i ] );
+   }
+}