X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_dead.c;h=72eba265f443c92512051b77b485e41b6e15b030;hb=refs%2Fheads%2Fmaster;hp=5f4ab7260a26cfca7648a0074d01014ecbf10648;hpb=5f6a4f9df6c8accc89f1920bfe9ace3cbac4c4b6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_dead.c b/player_dead.c deleted file mode 100644 index 5f4ab72..0000000 --- a/player_dead.c +++ /dev/null @@ -1,198 +0,0 @@ -#include "skaterift.h" -#include "player_dead.h" -#include "gui.h" - -struct player_dead player_dead; -struct player_subsystem_interface player_subsystem_dead = { - .update = player__dead_update, - .post_update = player__dead_post_update, - .animate = player__dead_animate, - .pose = player__dead_pose, - .post_animate = player__dead_post_animate, - .im_gui = player__dead_im_gui, - .bind = player__dead_bind, - - .animator_data = &player_dead.animator, - .animator_size = sizeof(player_dead.animator), - .network_animator_exchange = player__dead_animator_exchange, - .name = "Dead" -}; - -void player__dead_update(void){ - player_ragdoll_iter( &localplayer.ragdoll ); -} - -void player__dead_post_update(void){ - struct ragdoll_part *part = - &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; - struct player_dead *d = &player_dead; - - v3f ext_co; - v4f ext_q; - rb_extrapolate( &part->rb, ext_co, ext_q ); - - v3_lerp( d->co_lpf, ext_co, vg.time_frame_delta*4.0f, d->co_lpf ); - v3_lerp( d->v_lpf, part->rb.v, vg.time_frame_delta*4.0f, d->v_lpf ); - v3_lerp( d->w_lpf, part->rb.w, vg.time_frame_delta*4.0f, d->w_lpf ); - - v3_copy( d->co_lpf, localplayer.rb.co ); - v3_zero( localplayer.rb.v ); - v3_zero( localplayer.rb.w ); - - if( (skaterift.activity == k_skaterift_default) && - button_down(k_srbind_dead_respawn) ){ - ent_spawn *spawn = world_find_closest_spawn( - world_current_instance(), localplayer.rb.co ); - - if( spawn ){ - v3_copy( spawn->transform.co, localplayer.rb.co ); - player__reset(); - srinput.state = k_input_state_resume; - } - else { - vg_error( "No spawns!\n" ); - } - } -} - -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 skeleton *sk = &localplayer.skeleton; - - m4x3f transforms[ 32 ]; - - /* root transform */ - q_m3x3( localplayer.rb.q, transforms[0] ); - v3_copy( localplayer.rb.co, transforms[0][3] ); - - v4_copy( localplayer.rb.q, animator->transforms[0].q ); - v3_copy( localplayer.rb.co, animator->transforms[0].co ); - - /* colliders with bones transforms */ - for( int i=0; ipart_count; i++ ){ - struct ragdoll_part *part = &rd->parts[i]; - - m4x3f mtx; - - v4f q_int; - v3f co_int; - - float substep = vg.time_fixed_extrapolate; - v3_lerp( part->prev_co, part->rb.co, substep, co_int ); - q_nlerp( part->prev_q, part->rb.q, substep, q_int ); - v4_copy( part->rb.q, q_int ); - - q_m3x3( q_int, mtx ); - v3_copy( co_int, mtx[3] ); - - m4x3_mul( mtx, part->inv_collider_mtx, transforms[part->bone_id] ); - } - - /* bones without colliders transforms */ - for( u32 i=1; ibone_count; i++ ){ - struct skeleton_bone *sb = &sk->bones[i]; - - if( sb->parent && !sb->collider ){ - v3f delta; - v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, delta ); - - m4x3f posemtx; - m3x3_identity( posemtx ); - v3_copy( delta, posemtx[3] ); - - /* final matrix */ - m4x3_mul( transforms[sb->parent], posemtx, transforms[i] ); - } - } - - /* measurements */ - for( u32 i=1; ibone_count; i++ ){ - struct skeleton_bone *sb = &sk->bones[i]; - - v3_zero( animator->transforms[i].co ); - q_identity( animator->transforms[i].q ); - - m4x3f parent, inverse, local; - m3x3_identity( parent ); - v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, parent[3] ); - m4x3_mul( transforms[ sb->parent ], parent, parent ); - m4x3_invert_affine( parent, inverse ); - - v3f _s; - m4x3_mul( inverse, transforms[i], local ); - m4x3_decompose( local, animator->transforms[i].co, - animator->transforms[i].q, _s ); - } -} - -void player__dead_pose( void *_animator, player_pose *pose ) -{ - struct player_dead_animator *animator = _animator; - struct player_ragdoll *rd = &localplayer.ragdoll; - struct skeleton *sk = &localplayer.skeleton; - - pose->type = k_player_pose_type_fk_2; - pose->board.lean = 0.0f; - - v3_copy( animator->transforms[0].co, pose->root_co ); - v4_copy( animator->transforms[0].q, pose->root_q ); - - for( u32 i=1; ibone_count; i++ ){ - v3_copy( animator->transforms[i].co, pose->keyframes[i-1].co ); - v4_copy( animator->transforms[i].q, pose->keyframes[i-1].q ); - v3_fill( pose->keyframes[i-1].s, 1.0f ); - } -} - -void player__dead_post_animate(void) -{ - localplayer.cam_velocity_influence = 1.0f; -} - -void player__dead_im_gui(void) -{ -} - -void player__dead_transition( enum player_die_type type ) -{ - localplayer.subsystem = k_player_subsystem_dead; - copy_localplayer_to_ragdoll( &localplayer.ragdoll, type ); - - struct ragdoll_part *part = - &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; - v3_copy( part->rb.co, player_dead.co_lpf ); - v3_copy( part->rb.v, player_dead.v_lpf ); - v3_copy( part->rb.w, player_dead.w_lpf ); - - gui_helper_clear(); - vg_str str; - - struct gui_helper *h; - if( (h = gui_new_helper(input_button_list[k_srbind_reset], &str) )){ - vg_strcat( &str, "rewind" ); - - if( world_static.active_instance == k_world_purpose_hub ) - h->greyed = 1; - } - - if( gui_new_helper(input_button_list[k_srbind_dead_respawn], &str )) - vg_strcat( &str, "spawn" ); -} - -void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ) -{ - struct player_dead_animator *animator = data; - - for( u32 i=0; itransforms[i].co ); - bitpack_qquat( ctx, animator->transforms[i].q ); - } -} - -void player__dead_bind(void) -{ - struct skeleton *sk = &localplayer.skeleton; - player_dead.anim_bail = skeleton_get_anim( sk, "pose_bail_ball" ); -}