remote items test
[carveJwlIkooP6JGAAIwe30JlM.git] / player_remote.c
index b51c857e61ba16122f08af53dd23d71ef1af6d88..3d674bcda2257d37a645b802818b39ee3006000b 100644 (file)
@@ -2,6 +2,7 @@
 #include "skeleton.h"
 #include "player_render.h"
 #include "network_common.h"
+#include "addon.h"
 
 static void player_remote_unwatch( struct network_player *player ){
    addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot );
@@ -126,6 +127,31 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
       player->subsystem = frame->subsystem;
       player->down_bytes += msg->m_cbSize;
    }
+   else if( tmp->inetmsg_id == k_inetmsg_playeritem ){
+      netmsg_playeritem *item = msg->m_pData;
+      if( !packet_minsize( msg, sizeof(*item)+1 )) return;
+
+      vg_info( "Client #%u equiped: [%u] %s\n", 
+               item->client, item->type, item->uid );
+
+      struct network_player *player = &netplayers.list[ item->client ];
+
+      char uid[ ADDON_UID_MAX ];
+      network_msgstring( item->uid, msg->m_cbSize, sizeof(*item),
+                         uid, ADDON_UID_MAX );
+
+      if( item->type == k_addon_type_board ){
+         addon_cache_unwatch( k_addon_type_board, player->board_view_slot );
+         player->board_view_slot = 
+            addon_cache_create_viewer_from_uid( k_addon_type_board, uid );
+      }
+      else if( item->type == k_addon_type_player ){
+         addon_cache_unwatch( k_addon_type_player, 
+                              player->playermodel_view_slot );
+         player->playermodel_view_slot =
+            addon_cache_create_viewer_from_uid( k_addon_type_player, uid );
+      }
+   }
 }
 
 /*
@@ -366,14 +392,35 @@ static void animate_remote_players(void){
  * Draw remote players
  */
 static void render_remote_players( world_instance *world, camera *cam ){
+
+   SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+
    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;
+      m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*i ];
+
+      struct player_model *model = 
+         addon_cache_item_if_loaded( k_addon_type_player, 
+                                     player->playermodel_view_slot );
+
+      if( !model ) model = &localplayer.fallback_model;
+      render_playermodel( cam, world, 0, model, &av->sk, final_mtx );
+
+      struct player_board *board = 
+         addon_cache_item_if_loaded( k_addon_type_board,
+                                     player->board_view_slot );
 
-      struct player_model *model = &localplayer.fallback_model;
-      render_playermodel( cam, world, 0, model, &av->sk,
-                          &netplayers.final_mtx[ av->sk.bone_count*i ] );
+      /* TODO: Board pose */
+#if 0
+      render_board( cam, world, board, 
+                     final_mtx[localplayer.playeravatar->id_board],
+                     &localplayer.pose.board,
+                     k_board_shader_player );
+#endif
    }
+
+   SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
 }