From b35ac7383d4aba1d0b8a74be7bf1695996ff57f4 Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 11 Nov 2023 19:50:10 +0000 Subject: [PATCH] remove avatar concept --- player.c | 4 -- player.h | 23 +++++++++- player_common.c | 7 ++- player_dead.c | 19 ++++---- player_drive.c | 6 +-- player_ragdoll.c | 58 +++++++++--------------- player_ragdoll.h | 14 ++---- player_remote.c | 116 +++++++++++++++++++++++++++-------------------- player_remote.h | 4 +- player_render.c | 78 ++++++++++++++++--------------- player_render.h | 21 --------- player_skate.c | 63 ++++++++++++------------- player_walk.c | 24 +++++----- skaterift.c | 22 ++++----- workshop.c | 2 +- 15 files changed, 221 insertions(+), 240 deletions(-) diff --git a/player.c b/player.c index de96060..5bd4332 100644 --- 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, diff --git a/player.h b/player.h index c718c5a..9757030 100644 --- 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 ); diff --git a/player_common.c b/player_common.c index eeed469..84ce9e3 100644 --- a/player_common.c +++ b/player_common.c @@ -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 ); diff --git a/player_dead.c b/player_dead.c index 8c558ee..8f7170e 100644 --- a/player_dead.c +++ b/player_dead.c @@ -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; isk.bone_count; i ++ ){ + for( u32 i=0; itransforms[i].co ); bitpack_qquat( ctx, animator->transforms[i].q ); } diff --git a/player_drive.c b/player_drive.c index 90036a6..0d97e3b 100644 --- a/player_drive.c +++ b/player_drive.c @@ -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" ); } diff --git a/player_ragdoll.c b/player_ragdoll.c index d5029dd..ac6e902 100644 --- a/player_ragdoll.c +++ b/player_ragdoll.c @@ -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; jpart_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; isk.bone_count; i ++ ){ - struct skeleton_bone *bone = &av->sk.bones[i]; + for( u32 i=1; ibone_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; ipart_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; isk.bone_count; i++ ){ - struct skeleton_bone *sb = &av->sk.bones[i]; + for( u32 i=1; iparent && !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; ipart_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 */ diff --git a/player_ragdoll.h b/player_ragdoll.h index 52c2ec9..2ea5727 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -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 ); diff --git a/player_remote.c b/player_remote.c index 6358daa..493bc51 100644 --- a/player_remote.c +++ b/player_remote.c @@ -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; iactive || 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; iactive = 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; iusername)-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; iactive || !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, "", + 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; iactive ){ + remote_player_nametag( + pv, + netplayers.final_mtx[localplayer.skeleton.bone_count*i][3], + player->username ); + } + } +} diff --git a/player_remote.h b/player_remote.h index 580a726..fe72e60 100644 --- a/player_remote.h +++ b/player_remote.h @@ -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; diff --git a/player_render.c b/player_render.c index 92aecbe..13e4ada 100644 --- a/player_render.c +++ b/player_render.c @@ -15,29 +15,38 @@ #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 ); } diff --git a/player_render.h b/player_render.h index 4ea095c..f5c6de9 100644 --- a/player_render.h +++ b/player_render.h @@ -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 diff --git a/player_skate.c b/player_skate.c index a89783c..745a6ff 100644 --- a/player_skate.c +++ b/player_skate.c @@ -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; ikeyframes[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 ); diff --git a/player_walk.c b/player_walk.c index 193e79a..100e21f 100644 --- a/player_walk.c +++ b/player_walk.c @@ -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" ); diff --git a/skaterift.c b/skaterift.c index 0e1f852..8aa061b 100644 --- a/skaterift.c +++ b/skaterift.c @@ -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(); + } } diff --git a/workshop.c b/workshop.c index 4d8856b..5b0d585 100644 --- a/workshop.c +++ b/workshop.c @@ -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; -- 2.25.1