remove avatar concept
authorhgn <hgodden00@gmail.com>
Sat, 11 Nov 2023 19:50:10 +0000 (19:50 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 11 Nov 2023 19:50:10 +0000 (19:50 +0000)
15 files changed:
player.c
player.h
player_common.c
player_dead.c
player_drive.c
player_ragdoll.c
player_ragdoll.h
player_remote.c
player_remote.h
player_render.c
player_render.h
player_skate.c
player_walk.c
skaterift.c
workshop.c

index de96060710677edb746e08277838848ea485e8e8..5bd43325c4945ac8b47df3fe2080c9518c95ce89 100644 (file)
--- a/player.c
+++ b/player.c
@@ -66,10 +66,6 @@ static void player__debugtext( int size, const char *fmt, ... ){
 /* 
  * Appearence
  */
-static void player__use_avatar( struct player_avatar *av ){
-   localplayer.playeravatar = av;
-   player_setup_ragdoll_from_avatar( &localplayer.ragdoll, av );
-}
 
 static void player__use_model( u16 reg_id ){
    addon_cache_unwatch( k_addon_type_player, 
index c718c5ac57eb4ccc66f5cc311ab472001293ddcb..9757030d3fc201c4439edaea39e2b06f11aedbca 100644 (file)
--- a/player.h
+++ b/player.h
@@ -115,7 +115,6 @@ struct {
     * --------------------------------------------------
     */
 
-   struct player_avatar  *playeravatar;
    struct player_ragdoll  ragdoll;
    struct player_model    fallback_model;
 
@@ -133,6 +132,27 @@ struct {
     */
 
    enum player_subsystem subsystem; /* .. prev */
+
+   /*
+    * Rendering
+    */
+   mdl_context skeleton_meta;
+   struct skeleton skeleton;
+
+   u32 id_hip,
+       id_chest,
+       id_ik_hand_l,
+       id_ik_hand_r,
+       id_ik_elbow_l,
+       id_ik_elbow_r,
+       id_head,
+       id_ik_foot_l,
+       id_ik_foot_r,
+       id_ik_knee_l,
+       id_ik_knee_r,
+       id_wheel_l,
+       id_wheel_r,
+       id_board;
 }
 static localplayer = {
    .rb = {
@@ -158,7 +178,6 @@ struct player_subsystem_interface static *player_subsystems[] = {
  */
 
 static void player__debugtext( int size, const char *fmt, ... );
-static void player__use_avatar( struct player_avatar *av );
 static void player__use_mesh( glmesh *mesh );
 static void player__use_texture( vg_tex2d *tex );
 static void player__use_model( u16 reg_id );
index eeed469d04c52c8b7cdbf36d04709a6eaf967ef3..84ce9e3606e1deb7c937dde3af1022152fad0c41 100644 (file)
@@ -52,14 +52,13 @@ static void player_camera_portal_correction(void){
          m4x3_invert_affine( localplayer.gate_waiting->transport, inverse );
          m4x3_mulv( inverse, localplayer.cam.pos, localplayer.cam.pos );
 
-         struct skeleton *sk = &localplayer.playeravatar->sk;
-         skeleton_apply_transform( sk, inverse, localplayer.final_mtx );
+         skeleton_apply_transform( &localplayer.skeleton, inverse, 
+                                    localplayer.final_mtx );
       }
    }
 }
 
 static void player__cam_iterate(void){
-   struct player_avatar *av = localplayer.playeravatar;
    struct player_cam_controller *cc = &localplayer.cam_control;
 
    if( localplayer.subsystem == k_player_subsystem_walk ){
@@ -127,7 +126,7 @@ static void player__cam_iterate(void){
 
    /* position */
    v3f fpv_pos, fpv_offset;
-   m4x3_mulv( localplayer.final_mtx[ av->id_head-1 ], 
+   m4x3_mulv( localplayer.final_mtx[ localplayer.id_head-1 ], 
                cc->fpv_viewpoint_smooth, fpv_pos );
    m3x3_mulv( localplayer.rb.to_world, cc->fpv_offset_smooth, fpv_offset );
    v3_add( fpv_offset, fpv_pos, fpv_pos );
index 8c558eeb33f1e77e12f00018f480c98aeaf50c60..8f7170e281a78105207ec6ff99f766f1f7ae6da7 100644 (file)
@@ -8,8 +8,8 @@ static void player__dead_update(void){
 }
 
 static void player__dead_post_update(void){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct ragdoll_part *part = &localplayer.ragdoll.parts[ av->id_hip-1 ];
+   struct ragdoll_part *part = 
+      &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
    struct player_dead *d = &player_dead;
 
    v3f ext_co;
@@ -29,8 +29,7 @@ static void player__dead_animate(void){
    struct player_dead *d = &player_dead;
    struct player_dead_animator *animator = &d->animator;
    struct player_ragdoll *rd = &localplayer.ragdoll;
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    m4x3f transforms[ 32 ];
 
@@ -101,8 +100,7 @@ static void player__dead_animate(void){
 static void player__dead_pose( void *_animator, player_pose *pose ){
    struct player_dead_animator *animator = _animator;
    struct player_ragdoll *rd = &localplayer.ragdoll;
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    pose->type = k_player_pose_type_fk_2;
    pose->board.lean = 0.0f;
@@ -126,11 +124,10 @@ static void player__dead_im_gui(void){
 
 static void player__dead_transition(void){
    localplayer.subsystem = k_player_subsystem_dead;
-   copy_avatar_pose_to_ragdoll( localplayer.playeravatar, &localplayer.ragdoll, 
-                                localplayer.rb.v );
+   copy_localplayer_to_ragdoll( &localplayer.ragdoll, localplayer.rb.v );
 
-   struct player_avatar *av = localplayer.playeravatar;
-   struct ragdoll_part *part = &localplayer.ragdoll.parts[ av->id_hip-1 ];
+   struct ragdoll_part *part = 
+      &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
    v3_copy( part->obj.rb.co, player_dead.co_lpf );
    v3_copy( part->obj.rb.v,  player_dead.v_lpf );
    v3_copy( part->obj.rb.w,  player_dead.w_lpf );
@@ -139,7 +136,7 @@ static void player__dead_transition(void){
 static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){
    struct player_dead_animator *animator = data;
 
-   for( u32 i=0; i<localplayer.playeravatar->sk.bone_count; i ++ ){
+   for( u32 i=0; i<localplayer.skeleton.bone_count; i ++ ){
       bitpack_qv3f( ctx, 24, -1024.0f, 1024.0f, animator->transforms[i].co );
       bitpack_qquat( ctx, animator->transforms[i].q );
    }
index 90036a66f2549007a1f511b7d0c0fc0c93f024e3..0d97e3b269f1a2b77ad7756fd56a9209cbc73fe4 100644 (file)
@@ -26,7 +26,7 @@ static void player__drive_post_update(void){
 static void player__drive_animate(void){}
 
 static void player__drive_pose( void *animator, player_pose *pose ){
-   struct skeleton *sk = &localplayer.playeravatar->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    skeleton_sample_anim( sk, player_drive.anim_drive, 0.0f, pose->keyframes );
    v3_copy( localplayer.rb.co, pose->root_co );
@@ -60,9 +60,7 @@ static void player__drive_im_gui(void){
 }
 
 static void player__drive_bind(void){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
-
+   struct skeleton *sk = &localplayer.skeleton;
    player_drive.vehicle = &gzoomer;
    player_drive.anim_drive = skeleton_get_anim( sk, "idle_cycle+y" );
 }
index d5029dd72865edc08759f826d370587e6a10ac32..ac6e90240fc9fd3a6743dafa057b246777d86da5 100644 (file)
@@ -82,9 +82,7 @@ static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
 /*
  * Get parent index in the ragdoll
  */
-static u32 ragdoll_bone_parent( struct player_ragdoll *rd,
-                                   struct player_avatar *av, u32 bone_id )
-{
+static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id ){
    for( u32 j=0; j<rd->part_count; j++ )
       if( rd->parts[ j ].bone_id == bone_id )
          return j;
@@ -94,21 +92,20 @@ static u32 ragdoll_bone_parent( struct player_ragdoll *rd,
 }
 
 /*
- * Setup ragdoll colliders 
+ * Setup ragdoll colliders from skeleton
  */
-static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
-                                                 struct player_avatar *av )
-{
+static void setup_ragdoll_from_skeleton( struct skeleton *sk,
+                                         struct player_ragdoll *rd ){
    rd->part_count = 0;
 
-   if( !av->sk.collider_count )
+   if( !sk->collider_count )
       return;
 
    rd->position_constraints_count = 0;
    rd->cone_constraints_count = 0;
 
-   for( u32 i=1; i<av->sk.bone_count; i ++ ){
-      struct skeleton_bone *bone = &av->sk.bones[i];
+   for( u32 i=1; i<sk->bone_count; i ++ ){
+      struct skeleton_bone *bone = &sk->bones[i];
 
       /*
        * Bones with colliders
@@ -131,16 +128,15 @@ static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
       if( !bone->parent )
          continue;
 
-      rp->parent = ragdoll_bone_parent( rd, av, bone->parent );
-      
+      rp->parent = ragdoll_bone_parent( rd, bone->parent );
       
       if( bone->orig_bone->flags & k_bone_flag_cone_constraint ){
          struct rb_constr_pos *c = 
             &rd->position_constraints[ rd->position_constraints_count ++ ];
 
-         struct skeleton_bone *bj = &av->sk.bones[rp->bone_id];
+         struct skeleton_bone *bj = &sk->bones[rp->bone_id];
          struct ragdoll_part  *pp = &rd->parts[rp->parent];
-         struct skeleton_bone *bp = &av->sk.bones[pp->bone_id];
+         struct skeleton_bone *bp = &sk->bones[pp->bone_id];
 
          /* Convention: rba -- parent, rbb -- child */
          c->rba = &pp->obj.rb;
@@ -186,9 +182,7 @@ static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 /*
  * Make avatar copy the ragdoll
  */
-static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
-                                            struct player_avatar *av )
-{
+static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd ){
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
@@ -208,12 +202,13 @@ static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
                 localplayer.final_mtx[part->bone_id] );
    }
 
-   for( u32 i=1; i<av->sk.bone_count; i++ ){
-      struct skeleton_bone *sb = &av->sk.bones[i];
+   for( u32 i=1; i<localplayer.skeleton.bone_count; i++ ){
+      struct skeleton_bone *sb = &localplayer.skeleton.bones[i];
 
       if( sb->parent && !sb->collider ){
          v3f delta;
-         v3_sub( av->sk.bones[i].co, av->sk.bones[sb->parent].co, delta );
+         v3_sub( localplayer.skeleton.bones[i].co, 
+                 localplayer.skeleton.bones[sb->parent].co, delta );
 
          m4x3f posemtx;
          m3x3_identity( posemtx );
@@ -225,31 +220,29 @@ static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
       }
    }
 
-   skeleton_apply_inverses( &av->sk, localplayer.final_mtx );
+   skeleton_apply_inverses( &localplayer.skeleton, localplayer.final_mtx );
 }
 
 /*
  * Make the ragdoll copy the player model
  */
-static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
-                                            struct player_ragdoll *rd,
-                                            v3f velocity )
-{
+static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, v3f v ){
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
       v3f pos, offset;
       u32 bone = part->bone_id;
+      v3f *bone_mtx = localplayer.final_mtx[bone];
 
-      m4x3_mulv( localplayer.final_mtx[bone], av->sk.bones[bone].co, pos );
-      m3x3_mulv( localplayer.final_mtx[bone], part->collider_mtx[3], offset );
+      m4x3_mulv( bone_mtx, localplayer.skeleton.bones[bone].co, pos );
+      m3x3_mulv( bone_mtx, part->collider_mtx[3], offset );
       v3_add( pos, offset, part->obj.rb.co );
 
       m3x3f r;
-      m3x3_mul( localplayer.final_mtx[bone], part->collider_mtx, r );
+      m3x3_mul( bone_mtx, part->collider_mtx, r );
       m3x3_q( r, part->obj.rb.q );
 
-      v3_copy( velocity, part->obj.rb.v );
+      v3_copy( v, part->obj.rb.v );
       v3_zero( part->obj.rb.w );
 
       v3_copy( part->obj.rb.co, part->prev_co );
@@ -259,13 +252,6 @@ static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
    }
 }
 
-/*
- * Draw rigidbody colliders for ragdoll
- */
-static void player_debug_ragdoll(void)
-{
-}
-
 /*
  * Ragdoll physics step
  */
index 52c2ec9a20b34f603f1f2bff5dae704ff4bf617a..2ea5727fe1e94b3fbe17348edd057cf7a177b14d 100644 (file)
@@ -48,15 +48,11 @@ static int   k_ragdoll_div = 1,
 static void player_ragdoll_init(void);
 static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
                                                   struct ragdoll_part *rp );
-static u32 ragdoll_bone_parent( struct player_ragdoll *rd,
-                                   struct player_avatar *av, u32 bone_id );
-static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
-                                                 struct player_avatar *av );
-static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
-                                            struct player_avatar *av );
-static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
-                                            struct player_ragdoll *rd,
-                                            v3f velocity );
+static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id );
+static void setup_ragdoll_from_skeleton( struct skeleton *sk,
+                                         struct player_ragdoll *rd );
+static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd );
+static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, v3f v );
 static void player_debug_ragdoll(void);
 static void player_ragdoll_iter( struct player_ragdoll *rd );
 
index 6358daa94afe2df6fa3c992a6571a714c6d531bb..493bc513b1dc1f12b25a8c3a7ea2d9c6d35114e1 100644 (file)
@@ -356,7 +356,6 @@ static void remote_player_debug_update(void){
 }
 
 static void remote_player_nametag( m4x4f pv, v3f co, const char *name ){
-   return;
    vg_ui.font = &vg_ui_font_big;
    v4f wpos;
    v3_copy( co, wpos );
@@ -373,10 +372,16 @@ static void remote_player_nametag( m4x4f pv, v3f co, const char *name ){
       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;
+
+      vg_ui.font = &vg_ui_font_big;
+      wr[2] = ui_text_line_width( name );
       wr[3] = 32;
-      ui_fill( wr, (ui_colour(k_ui_bg)&0x00ffffff)|0x50000000 );
+
+      ui_fill( wr, ui_opacity( ui_colour(k_ui_bg), 0.6f ) );
       ui_text( wr, name, 1, k_ui_align_middle_center, 0 );
+
+      vg_ui.font = &vg_ui_font_small;
+
    }
    vg_ui.font = &vg_ui_font_small;
 }
@@ -440,24 +445,12 @@ static void remote_player_network_imgui( m4x4f pv ){
             snprintf( buf, 512, "#%u: %s [%s] D%.1fkbs", 
                       i, player->username, sysname, player->down_kbs );
             ui_info( panel, buf );
-
-            struct player_avatar *av = localplayer.playeravatar;
-            remote_player_nametag( 
-                  pv, 
-                  netplayers.final_mtx[av->sk.bone_count*i][3], 
-                  player->username );
          }
       }
    }
    else {
       ui_info( panel, "offline" );
    }
-
-   struct player_avatar *av = localplayer.playeravatar;
-   remote_player_nametag( 
-         pv, 
-         localplayer.final_mtx[0][3], 
-         "Localplayer" );
 }
 
 /*
@@ -470,8 +463,8 @@ static void pose_remote_player( u32 index,
    struct network_player *player = &netplayers.list[ index ];
 
    struct interp_buffer *buf = &netplayers.interp_data[ index ];
-   struct player_avatar *av = localplayer.playeravatar;
-   m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*index ];
+   struct skeleton *sk = &localplayer.skeleton;
+   m4x3f *final_mtx = &netplayers.final_mtx[ sk->bone_count*index ];
    struct player_board_pose *board_pose = &netplayers.board_poses[index];
 
    struct player_subsystem_interface *sys0 = player_subsystems[f0->subsystem],
@@ -502,13 +495,13 @@ static void pose_remote_player( u32 index,
       instance_id = f1->instance_id;
 
       lerp_player_pose( &pose0, &pose1, t, &posed );
-      apply_full_skeleton_pose( &av->sk, &posed, final_mtx );
+      apply_full_skeleton_pose( sk, &posed, final_mtx );
       memcpy( board_pose, &posed.board, sizeof(*board_pose) );
    }
    else {
       instance_id = f0->instance_id;
 
-      apply_full_skeleton_pose( &av->sk, &pose0, final_mtx );
+      apply_full_skeleton_pose( sk, &pose0, final_mtx );
       memcpy( board_pose, &pose0.board, sizeof(*board_pose) );
    }
 
@@ -588,29 +581,27 @@ static void animate_remote_players(void){
  */
 static void render_remote_players( world_instance *world, camera *cam ){
    SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+   struct skeleton *sk = &localplayer.skeleton;
 
    for( u32 i=0; i<NETWORK_MAX_PLAYERS; i ++ ){
       struct network_player *player = &netplayers.list[i];
       if( !player->active || player->isblocked ) continue;
       if( player->active_world != world ) continue;
       
-      struct player_avatar *av = localplayer.playeravatar;
-      m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*i ];
+      m4x3f *final_mtx = &netplayers.final_mtx[ 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 );
+      render_playermodel( cam, world, 0, model, sk, final_mtx );
 
       struct player_board *board = 
          addon_cache_item_if_loaded( k_addon_type_board,
                                      player->board_view_slot );
-      render_board( cam, world, board, 
-                     final_mtx[localplayer.playeravatar->id_board],
-                     &netplayers.board_poses[ i ],
-                     k_board_shader_player );
+      render_board( cam, world, board, final_mtx[localplayer.id_board],
+                     &netplayers.board_poses[ i ], k_board_shader_player );
    }
 
    SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
@@ -652,16 +643,38 @@ static void render_remote_players_tags( world_instance *world, camera *cam ){
       if( !player->active || player->isblocked ) continue;
       if( player->active_world != world ) continue;
 
-      struct player_avatar *av = localplayer.playeravatar;
       render_remote_player_nametag( 
-            netplayers.final_mtx[av->sk.bone_count*i][3], 
+            netplayers.final_mtx[localplayer.skeleton.bone_count*i][3], 
             player->username );
    }
 
    glDisable(GL_BLEND);
 }
 
+static int remote_players_randomize( int argc, const char *argv[] ){
+   for( int i=0; i<NETWORK_MAX_PLAYERS; i ++ ){
+      struct network_player *player = &netplayers.list[i];
+
+      player->active = vg_randu32() & 0x1;
+      player->isfriend = vg_randu32() & vg_randu32() & 0x1;
+      player->isblocked = vg_randu32() & vg_randu32() & vg_randu32() & 0x1;
+      player->world_match[ 0 ] = vg_randu32() & 0x1;
+      player->world_match[ 1 ] = 0;
+
+      for( int i=0; i<sizeof(player->username)-1; i ++ ){
+         player->username[i] = 'a' + (vg_randu32() % 30);
+         player->username[i+1] = '\0';
+
+         if( (vg_randu32() % 8) == 3 )
+            break;
+      }
+   }
+
+   return 0;
+}
+
 static void remote_players_init(void){
+   vg_console_reg_cmd( "add_test_players", remote_players_randomize, NULL );
    vg_console_reg_var( "k_show_own_name", &k_show_own_name, 
                        k_var_dtype_i32, 0 );
    for( u32 i=0; i<NETWORK_SFX_QUEUE_LENGTH; i ++ ){
@@ -685,8 +698,8 @@ static void remote_sfx_pre_update(void){
 
 enum remote_player_gui_type {
    k_remote_player_gui_type_stranger,
+   k_remote_player_gui_type_friend,
    k_remote_player_gui_type_you,
-   k_remote_player_gui_type_friend
 };
 
 static void remote_player_gui_info( ui_rect box, 
@@ -717,40 +730,47 @@ static void remote_player_gui_info( ui_rect box,
    ui_text( bottom, activity, 1, k_ui_align_middle_center, fg );
 }
 
-static void remote_players_imgui(void){
-   /* TODO: or if respawning, override show this and disable input
-    *       if in menu dont render. */
-
-   if( button_down(k_srbind_lobby) )
-      netplayers.view_lobby ^= 0x1;
-
-   vg_slewf( &netplayers.fview_lobby, netplayers.view_lobby, 
-             vg.time_frame_delta / 0.5f );
+static void remote_players_imgui_lobby(void){
+    /*
+    * TODO: send location string over the network */
 
    ui_px y = 50, width = 200, height = 42, gap = 2,
-         x = vg.window_x - ((f32)width*netplayers.fview_lobby);
-
-   int type = vg.time,
-       in_world = vg.time / 3.0;
-
+         x = vg.window_x - width;
 
    vg_ui.font = &vg_ui_font_big;
    ui_text( (ui_rect){ x, 0, width, height }, 
-            "In World", 1, k_ui_align_middle_center, 0 );
+            "Online Players", 1, k_ui_align_middle_center, 0 );
    vg_ui.font = &vg_ui_font_small;
 
 
    ui_rect us = { x, y, width, height };
-   remote_player_gui_info( us, steam_username_at_startup, "1300 meters away",
-                           type % 3, in_world % 2 );
+   /* FIXME: your location */
+   remote_player_gui_info( us, steam_username_at_startup, "you",
+                           k_remote_player_gui_type_you, 1 );
    y += height + gap;
 
    for( u32 i=0; i<NETWORK_MAX_PLAYERS; i ++ ){
       struct network_player *player = &netplayers.list[i];
-      if( !player->active || !player->isfriend ) continue;
+      if( !player->active || player->isblocked ) continue;
       
       ui_rect box = { x, y, width, height };
-      remote_player_gui_info( box, player->username, "", 0, 0 );
+      remote_player_gui_info( 
+            box, player->username, "<null>", 
+            player->isfriend,
+            player->world_match[ world_static.active_instance ] );
       y += height + gap;
    }
 }
+
+static void remote_players_imgui_world( world_instance *world, m4x4f pv,
+                                        f32 max_dist ){
+   for( u32 i=0; i<NETWORK_MAX_PLAYERS; i++ ){
+      struct network_player *player = &netplayers.list[i];
+      if( player->active ){
+         remote_player_nametag( 
+               pv, 
+               netplayers.final_mtx[localplayer.skeleton.bone_count*i][3], 
+               player->username );
+      }
+   }
+}
index 580a726dee1f7ef510aa9865287135785c0db7b2..fe72e603f7228741db1008b5673757f899730866 100644 (file)
@@ -17,6 +17,7 @@ struct {
       /* this is set IF they exist in a world that we have loaded */
       world_instance *active_world;
       int world_match[ k_world_max ];
+      u32 location_pstr; /* TODO: valid if active_world set. */
 
       /* TODO: Compression with server code */
       char username[ NETWORK_USERNAME_MAX ];
@@ -58,9 +59,6 @@ struct {
    u32 up_bytes;
    f32 up_kbs, down_kbs;
    f64 last_data_measurement;
-
-   int view_lobby;
-   f32 fview_lobby;
 }
 static netplayers;
 
index 92aecbe5635578f0f72706d5d49e1d1fb8ecae0b..13e4ada179505ce5f72ef8b35c267e9be6a8408a 100644 (file)
 #include "shaders/model_board_view.h"
 #include "depth_compare.h"
 
-static void player_avatar_load( struct player_avatar *av, const char *path ){
-   mdl_open( &av->meta, path, vg_mem.rtmemory );
-   mdl_load_metadata_block( &av->meta, vg_mem.rtmemory );
-   mdl_load_animation_block( &av->meta, vg_mem.rtmemory );
-   mdl_close( &av->meta );
-
-   struct skeleton *sk = &av->sk;
-   skeleton_setup( sk, vg_mem.rtmemory, &av->meta );
-
-   av->id_hip        = skeleton_bone_id( sk, "hips" );
-   av->id_chest      = skeleton_bone_id( sk, "chest" );
-   av->id_ik_hand_l  = skeleton_bone_id( sk, "hand.IK.L" );
-   av->id_ik_hand_r  = skeleton_bone_id( sk, "hand.IK.R" );
-   av->id_ik_elbow_l = skeleton_bone_id( sk, "elbow.L" );
-   av->id_ik_elbow_r = skeleton_bone_id( sk, "elbow.R" );
-   av->id_head       = skeleton_bone_id( sk, "head" );
-   av->id_ik_foot_l  = skeleton_bone_id( sk, "foot.IK.L" );
-   av->id_ik_foot_r  = skeleton_bone_id( sk, "foot.IK.R" );
-   av->id_board      = skeleton_bone_id( sk, "board" );
-   av->id_wheel_l    = skeleton_bone_id( sk, "wheel.L" );
-   av->id_wheel_r    = skeleton_bone_id( sk, "wheel.R" );
-   av->id_ik_knee_l  = skeleton_bone_id( sk, "knee.L" );
-   av->id_ik_knee_r  = skeleton_bone_id( sk, "knee.R" );
+static void player_load_animation_reference( const char *path ){
+   mdl_context *meta = &localplayer.skeleton_meta;
+   mdl_open( meta, path, vg_mem.rtmemory );
+   mdl_load_metadata_block( meta, vg_mem.rtmemory );
+   mdl_load_animation_block( meta, vg_mem.rtmemory );
+   mdl_close( meta );
+
+   struct skeleton *sk = &localplayer.skeleton;
+   skeleton_setup( sk, vg_mem.rtmemory, meta );
+
+   localplayer.id_hip        = skeleton_bone_id( sk, "hips" );
+   localplayer.id_chest      = skeleton_bone_id( sk, "chest" );
+   localplayer.id_ik_hand_l  = skeleton_bone_id( sk, "hand.IK.L" );
+   localplayer.id_ik_hand_r  = skeleton_bone_id( sk, "hand.IK.R" );
+   localplayer.id_ik_elbow_l = skeleton_bone_id( sk, "elbow.L" );
+   localplayer.id_ik_elbow_r = skeleton_bone_id( sk, "elbow.R" );
+   localplayer.id_head       = skeleton_bone_id( sk, "head" );
+   localplayer.id_ik_foot_l  = skeleton_bone_id( sk, "foot.IK.L" );
+   localplayer.id_ik_foot_r  = skeleton_bone_id( sk, "foot.IK.R" );
+   localplayer.id_board      = skeleton_bone_id( sk, "board" );
+   localplayer.id_wheel_l    = skeleton_bone_id( sk, "wheel.L" );
+   localplayer.id_wheel_r    = skeleton_bone_id( sk, "wheel.R" );
+   localplayer.id_ik_knee_l  = skeleton_bone_id( sk, "knee.L" );
+   localplayer.id_ik_knee_r  = skeleton_bone_id( sk, "knee.R" );
+
+   setup_ragdoll_from_skeleton( sk, &localplayer.ragdoll );
+
+   /* allocate matrix buffers for localplayer and remote players */
+   u32 mtx_size = sizeof(m4x3f)*sk->bone_count;
+   localplayer.final_mtx = vg_linear_alloc( vg_mem.rtmemory, mtx_size );
+   netplayers.final_mtx = vg_linear_alloc( vg_mem.rtmemory, 
+                                           mtx_size*NETWORK_MAX_PLAYERS );
 }
 
 /* TODO: Standard model load */
@@ -175,7 +184,7 @@ static void player__animate(void){
    player_pose *pose = &localplayer.pose;
    sys->pose( sys->animator_data, pose );
 
-   struct skeleton *sk = &localplayer.playeravatar->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    if( localplayer.holdout_time > 0.0f ){
       skeleton_lerp_pose( sk, 
@@ -190,8 +199,7 @@ static void player__animate(void){
       localplayer.holdout_time -= vg.time_frame_delta * 2.0f;
    }
 
-   apply_full_skeleton_pose( &localplayer.playeravatar->sk, &localplayer.pose,
-                             localplayer.final_mtx );
+   apply_full_skeleton_pose( sk, &localplayer.pose, localplayer.final_mtx );
    skeleton_debug( sk, localplayer.final_mtx );
 
    if( sys->post_animate )
@@ -212,7 +220,7 @@ static void player_copy_frame_animator( replay_frame *frame ){
 
 static void lerp_player_pose( player_pose *pose0, player_pose *pose1, f32 t,
                               player_pose *posed ){
-   struct skeleton *sk = &localplayer.playeravatar->sk;
+   struct skeleton *sk = &localplayer.skeleton;
    
    v3_lerp( pose0->root_co, pose1->root_co, t, posed->root_co );
    q_nlerp( pose0->root_q,  pose1->root_q,  t, posed->root_q );
@@ -261,13 +269,12 @@ static void player__animate_from_replay( replay_buffer *replay ){
    }
    else return;
 
-   apply_full_skeleton_pose( &localplayer.playeravatar->sk, &localplayer.pose,
+   apply_full_skeleton_pose( &localplayer.skeleton, &localplayer.pose,
                              localplayer.final_mtx );
 }
 
 static void player__pre_render(void){
    /* shadowing/ao info */
-   struct player_avatar *av = localplayer.playeravatar;
    struct player_board *board = 
       addon_cache_item_if_loaded( k_addon_type_board,
                                   localplayer.board_view_slot );
@@ -282,8 +289,9 @@ static void player__pre_render(void){
    }
 
    struct ub_world_lighting *ubo = &world_current_instance()->ub_lighting;
-   m4x3_mulv( localplayer.final_mtx[ av->id_board ], vp0, ubo->g_board_0 );
-   m4x3_mulv( localplayer.final_mtx[ av->id_board ], vp1, ubo->g_board_1 );
+   v3f *board_mtx = localplayer.final_mtx[ localplayer.id_board ];
+   m4x3_mulv( board_mtx, vp0, ubo->g_board_0 );
+   m4x3_mulv( board_mtx, vp1, ubo->g_board_1 );
 }
 
 static void render_board( camera *cam, world_instance *world,
@@ -449,17 +457,15 @@ static void player__render( camera *cam ){
                                   localplayer.playermodel_view_slot );
 
    if( !model ) model = &localplayer.fallback_model;
-   render_playermodel( cam, world, 1, model, &localplayer.playeravatar->sk,
+   render_playermodel( cam, world, 1, model, &localplayer.skeleton,
                        localplayer.final_mtx );
 
    struct player_board *board = 
       addon_cache_item_if_loaded( k_addon_type_board,
                                   localplayer.board_view_slot );
 
-   render_board( cam, world, board, localplayer.final_mtx[
-                                       localplayer.playeravatar->id_board],
-                                    &localplayer.pose.board,
-                                    k_board_shader_player );
+   render_board( cam, world, board, localplayer.final_mtx[localplayer.id_board],
+                  &localplayer.pose.board, k_board_shader_player );
 
    SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
 }
index 4ea095cb5088059edc2da4eec01d55176d3b3543..f5c6de9a80d1ac8b961ec0436f9cacf5799db404 100644 (file)
@@ -6,27 +6,6 @@
 #include "camera.h"
 #include "world.h"
 
-struct player_avatar
-{
-   mdl_context meta;
-   struct skeleton sk;
-
-   u32 id_hip,
-       id_chest,
-       id_ik_hand_l,
-       id_ik_hand_r,
-       id_ik_elbow_l,
-       id_ik_elbow_r,
-       id_head,
-       id_ik_foot_l,
-       id_ik_foot_r,
-       id_ik_knee_l,
-       id_ik_knee_r,
-       id_wheel_l,
-       id_wheel_r,
-       id_board;
-};
-
 enum eboard_truck{
    k_board_truck_back = 0,
    k_board_truck_front = 1
index a89783c7e15ef669355b154114b2ea6aa7a0ebcd..745a6ff85b07cf437ce4280fca186c93158d42db 100644 (file)
@@ -9,9 +9,7 @@
 #include "addon.h"
 
 static void player__skate_bind(void){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
-
+   struct skeleton *sk = &localplayer.skeleton;
    rb_update_transform( &localplayer.rb );
 
    struct { struct skeleton_anim **anim; const char *name; }
@@ -2903,8 +2901,7 @@ static void player__skate_animate(void){
 }
                         
 static void player__skate_pose( void *_animator, player_pose *pose ){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
    struct player_skate_animator *animator = _animator;
 
    pose->type = k_player_pose_type_ik;
@@ -2986,14 +2983,14 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
    skeleton_lerp_pose( sk, ground_pose, air_pose, animator->fly, 
                        pose->keyframes );
 
-   mdl_keyframe *kf_board    = &pose->keyframes[av->id_board-1],
-                *kf_foot_l   = &pose->keyframes[av->id_ik_foot_l-1],
-                *kf_foot_r   = &pose->keyframes[av->id_ik_foot_r-1],
-                *kf_knee_l   = &pose->keyframes[av->id_ik_knee_l-1],
-                *kf_knee_r   = &pose->keyframes[av->id_ik_knee_r-1],
-                *kf_hip      = &pose->keyframes[av->id_hip-1],
-                *kf_wheels[] = { &pose->keyframes[av->id_wheel_r-1],
-                                 &pose->keyframes[av->id_wheel_l-1] };
+   mdl_keyframe *kf_board    = &pose->keyframes[localplayer.id_board-1],
+                *kf_foot_l   = &pose->keyframes[localplayer.id_ik_foot_l-1],
+                *kf_foot_r   = &pose->keyframes[localplayer.id_ik_foot_r-1],
+                *kf_knee_l   = &pose->keyframes[localplayer.id_ik_knee_l-1],
+                *kf_knee_r   = &pose->keyframes[localplayer.id_ik_knee_r-1],
+                *kf_hip      = &pose->keyframes[localplayer.id_hip-1],
+                *kf_wheels[] = { &pose->keyframes[localplayer.id_wheel_r-1],
+                                 &pose->keyframes[localplayer.id_wheel_l-1] };
 
 
    mdl_keyframe grind_pose[32];
@@ -3009,11 +3006,11 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
    float add_grab_mod = 1.0f - animator->fly;
 
    /* additive effects */
-   u32 apply_to[] = { av->id_hip, 
-                      av->id_ik_hand_l,
-                      av->id_ik_hand_r,
-                      av->id_ik_elbow_l,
-                      av->id_ik_elbow_r };
+   u32 apply_to[] = { localplayer.id_hip, 
+                      localplayer.id_ik_hand_l,
+                      localplayer.id_ik_hand_r,
+                      localplayer.id_ik_elbow_l,
+                      localplayer.id_ik_elbow_r };
 
    float apply_rates[] = { 1.0f,
                            0.75f,
@@ -3028,11 +3025,11 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
 
    /* angle 'correction' */
    v3f origin;
-   v3_add( av->sk.bones[av->id_hip].co, kf_hip->co, origin );
+   v3_add( sk->bones[localplayer.id_hip].co, kf_hip->co, origin );
 
    for( int i=0; i<vg_list_size(apply_to); i ++ ){
       mdl_keyframe *kf = &pose->keyframes[apply_to[i]-1];
-      keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co,
+      keyframe_rotate_around( kf, origin, sk->bones[apply_to[i]].co,
                               animator->qfixuptotal );
    }
 
@@ -3094,14 +3091,13 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
       q_normalize( kf_wheels[i]->q );
    }
 
-#if 0
    {
       mdl_keyframe
-         *kf_head    = &pose->keyframes[av->id_head-1],
-         *kf_elbow_l = &pose->keyframes[av->id_ik_elbow_l-1],
-         *kf_elbow_r = &pose->keyframes[av->id_ik_elbow_r-1],
-         *kf_hand_l  = &pose->keyframes[av->id_ik_hand_l-1],
-         *kf_hand_r  = &pose->keyframes[av->id_ik_hand_r-1];
+         *kf_head    = &pose->keyframes[localplayer.id_head-1],
+         *kf_elbow_l = &pose->keyframes[localplayer.id_ik_elbow_l-1],
+         *kf_elbow_r = &pose->keyframes[localplayer.id_ik_elbow_r-1],
+         *kf_hand_l  = &pose->keyframes[localplayer.id_ik_hand_l-1],
+         *kf_hand_r  = &pose->keyframes[localplayer.id_ik_hand_r-1];
 
       float warble = perlin1d( vg.time, 2.0f, 2, 300 );
             warble *= vg_maxf(animator->grind, fabsf(animator->weight)) * 0.3f;
@@ -3111,31 +3107,28 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
 
       v3f origin = {0.0f,0.2f,0.0f};
       keyframe_rotate_around( kf_hand_l, origin, 
-                              av->sk.bones[av->id_ik_hand_l].co, qrot );
+                              sk->bones[localplayer.id_ik_hand_l].co, qrot );
       keyframe_rotate_around( kf_hand_r, origin, 
-                              av->sk.bones[av->id_ik_hand_r].co, qrot );
+                              sk->bones[localplayer.id_ik_hand_r].co, qrot );
       keyframe_rotate_around( kf_hip, origin, 
-                              av->sk.bones[av->id_hip].co, qrot );
+                              sk->bones[localplayer.id_hip].co, qrot );
       keyframe_rotate_around( kf_elbow_r, origin, 
-                              av->sk.bones[av->id_ik_elbow_r].co, qrot );
+                              sk->bones[localplayer.id_ik_elbow_r].co, qrot );
       keyframe_rotate_around( kf_elbow_l, origin, 
-                              av->sk.bones[av->id_ik_elbow_l].co, qrot );
+                              sk->bones[localplayer.id_ik_elbow_l].co, qrot );
 
       q_inv( qrot, qrot );
       q_mul( qrot, kf_head->q, kf_head->q );
       q_normalize( kf_head->q );
    }
-#endif
 }
 
 static void player__skate_post_animate(void){
-   struct player_avatar *av = localplayer.playeravatar;
    struct player_skate_state *state = &player_skate.state;
-
    localplayer.cam_velocity_influence = 1.0f;
 
    v3f head = { 0.0f, 1.8f, 0.0f };
-   m4x3_mulv( localplayer.final_mtx[ av->id_head ], 
+   m4x3_mulv( localplayer.final_mtx[ localplayer.id_head ], 
               head, state->head_position );
    m4x3_mulv( localplayer.rb.to_local, 
               state->head_position, state->head_position );
index 193e79a2feba0ecf8f6d28b7431c6456d87b473c..100e21f60e020b4ceea67f39bdcc2436515faf9d 100644 (file)
@@ -318,9 +318,10 @@ static void player__walk_pre_update(void){
                w->state.outro_start_time = vg.time;
                localplayer.immobile = 1;
 
-               struct player_avatar *av = localplayer.playeravatar;
-               m4x3_mulv( localplayer.final_mtx[ av->id_ik_foot_r ], 
-                          av->sk.bones[ av->id_ik_foot_r ].co, 
+               u32 foot_id = localplayer.id_ik_foot_r;
+
+               m4x3_mulv( localplayer.final_mtx[ foot_id ], 
+                          localplayer.skeleton.bones[ foot_id ].co, 
                           w->state.drop_in_foot_anchor );
             }
             else{
@@ -819,7 +820,6 @@ static void player__walk_animate(void){
    }
 
    if( w->state.outro_type ){
-      struct player_avatar *av = localplayer.playeravatar;
       struct skeleton_anim *anim = 
          player_walk_outro_anim( w->state.outro_type );
       f32 outro_length = (f32)anim->length / anim->rate,
@@ -890,8 +890,7 @@ static void player__walk_animate(void){
 static void player__walk_pose( void *_animator, player_pose *pose ){
    struct player_walk *w = &player_walk;
    struct player_walk_animator *animator = _animator;
-   struct skeleton *sk = &localplayer.playeravatar->sk;
-   struct player_avatar *av = localplayer.playeravatar;
+   struct skeleton *sk = &localplayer.skeleton;
 
    v3_copy( animator->root_co, pose->root_co );
    v4_copy( animator->root_q, pose->root_q );
@@ -926,14 +925,14 @@ static void player__walk_pose( void *_animator, player_pose *pose ){
       skeleton_sample_anim( sk, w->anim_sit, st*sit_norm, bpose );
 
       v4f qy,qp;
-      f32 *qh = bpose[av->id_head-1].q;
+      f32 *qh = bpose[localplayer.id_head-1].q;
       q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st );
       q_axis_angle( qp, (v3f){0.0f,0.0f,1.0f}, animator->pitch*st );
       q_mul( qy, qh, qh );
       q_mul( qh, qp, qh );
       q_normalize( qh );
 
-      qh = bpose[av->id_chest-1].q;
+      qh = bpose[localplayer.id_chest-1].q;
       q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st );
       q_mul( qy, qh, qh );
       q_normalize( qh );
@@ -965,9 +964,10 @@ static void player__walk_pose( void *_animator, player_pose *pose ){
          v3f anchored_pos;
          m4x3_mulv( inverse, animator->foot_anchor, anchored_pos );
 
-         v3_lerp( pose->keyframes[ av->id_ik_foot_r-1 ].co, anchored_pos, 
+         v3_lerp( pose->keyframes[ localplayer.id_ik_foot_r-1 ].co, 
+                  anchored_pos, 
                   1.0f-animator->commit_t,
-                  pose->keyframes[ av->id_ik_foot_r-1 ].co );
+                  pose->keyframes[ localplayer.id_ik_foot_r-1 ].co );
       }
    }
    else
@@ -979,7 +979,6 @@ static void player__walk_post_animate(void){
     * Camera 
     */
    struct player_walk *w = &player_walk;
-   struct player_avatar *av = localplayer.playeravatar;
 
    if( w->state.outro_type ){
       struct skeleton_anim *anim = player_walk_outro_anim(w->state.outro_type);
@@ -1030,8 +1029,7 @@ static void player__walk_im_gui(void){
 
 static void player__walk_bind(void){
    struct player_walk *w = &player_walk;
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    w->anim_idle         = skeleton_get_anim( sk, "idle_cycle+y" );
    w->anim_walk         = skeleton_get_anim( sk, "walk+y" );
index 0e1f85221bbb9cd8abbcb03c1992af2e822664b9..8aa061bb85ce3a183d4d245d521a750c1b0f771d 100644 (file)
@@ -57,7 +57,6 @@
 #include "player_remote.c"
 #include "vg/vg_audio_dsp.h"
 
-static struct player_avatar localplayer_avatar;
 static int k_tools_mode = 0;
 
 int main( int argc, char *argv[] ){
@@ -84,8 +83,6 @@ static void vg_launch_opt(void){
 }
 
 static void vg_preload(void){
-   //skaterift_read_savedata();
-
 vg_info(" Copyright  .        . .       -----, ,----- ,---.   .---.  \n" );
 vg_info(" 2021-2023  |\\      /| |           /  |      |    | |    /| \n" );
 vg_info("            | \\    / | +--        /   +----- +---'  |   / | \n" );
@@ -94,12 +91,13 @@ vg_info("            |   \\/   | |        /     |      |    \\ | /   | \n" );
 vg_info("            '        ' '--' [] '----- '----- '     ' '---'  " 
         "SOFTWARE\n" );
 
+   vg_loader_step( remote_players_init, NULL );
+
    if( k_tools_mode )
       return;
 
    steam_init();
    vg_loader_step( NULL, steam_end );
-   vg_loader_step( remote_players_init, NULL );
    vg_loader_step( network_init, network_end );
 }
 
@@ -217,14 +215,7 @@ static void vg_load(void){
    skaterift.replay.size = bytes;
    replay_clear( &skaterift.replay );
 
-   player_avatar_load( &localplayer_avatar, "models/ch_none.mdl" );
-   player__use_avatar( &localplayer_avatar );
-
-   /* FIXME FIXME FIXME FIXME FIXME */
-   u32 mtx_size = sizeof(m4x3f)*localplayer_avatar.sk.bone_count;
-   localplayer.final_mtx = vg_linear_alloc( vg_mem.rtmemory, mtx_size );
-   netplayers.final_mtx = vg_linear_alloc( vg_mem.rtmemory, 
-                                           mtx_size*NETWORK_MAX_PLAYERS );
+   player_load_animation_reference( "models/ch_none.mdl" );
 
    player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" );
    player__bind();
@@ -678,7 +669,12 @@ static void vg_gui(void){
    workshop_form_gui();
    render_view_framebuffer_ui();
    remote_player_network_imgui( vg.pv );
-   remote_players_imgui();
+
+
+   remote_players_imgui_world( world_current_instance(), vg.pv, INFINITY );
+   if( skaterift.activity == k_skaterift_respawning ){
+      remote_players_imgui_lobby();
+   }
 }
 
 
index 4d8856bed8a2410b89a6e300897d436f163120ac..5b0d5855e213ebaa0e61b2fc7eb068ec5b707bd0 100644 (file)
@@ -873,7 +873,7 @@ static void workshop_render_player_preview(void){
    glEnable( GL_DEPTH_TEST );
    glDisable( GL_BLEND );
 
-   struct skeleton *sk = &localplayer.playeravatar->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    player_pose res;
    res.type = k_player_pose_type_ik;