X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_dead.c;h=78cce2fb76614b6698cf01ed03bcaf11c63e295e;hb=5bfb36032928ba9f8d12e72961af68bfab9ea648;hp=f040adb47c55309f74b83615e2e100b78acccbc6;hpb=c4c762ce6f3bbdcb770bbc42e349aebbc3390d9d;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_dead.c b/player_dead.c index f040adb..78cce2f 100644 --- a/player_dead.c +++ b/player_dead.c @@ -8,46 +8,126 @@ VG_STATIC void player__dead_update ( player_instance *player ) player_ragdoll_iter( &player->ragdoll ); } -VG_STATIC void player__dead_animate ( player_instance *player, - player_animation *anim ) -{ - v3_zero( anim->root_co ); - q_identity( anim->root_q ); +VG_STATIC void player__dead_post_update( player_instance *player ){ + struct player_dead *d = &player->_dead; + struct player_avatar *av = player->playeravatar; + struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ]; + + v3f ext_co; + v4f ext_q; + rb_extrapolate( &part->obj.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->obj.rb.v, vg.time_frame_delta*4.0f, d->v_lpf ); + v3_lerp( d->w_lpf, part->obj.rb.w, vg.time_frame_delta*4.0f, d->w_lpf ); - for( int i=0; ipose ); i ++ ) - { - v3_zero( anim->pose[i].co ); - v3_fill( anim->pose[i].s, 1.0f ); - q_identity( anim->pose[i].q ); + v3_copy( d->co_lpf, player->rb.co ); + v3_zero( player->rb.v ); + v3_zero( player->rb.w ); +} + +VG_STATIC void player__dead_animate( player_instance *player ){ + struct player_dead *d = &player->_dead; + struct player_dead_animator *animator = &d->animator; + struct player_ragdoll *rd = &player->ragdoll; + struct player_avatar *av = player->playeravatar; + struct skeleton *sk = &av->sk; + + m4x3f transforms[ 32 ]; + + /* root transform */ + q_m3x3( player->rb.q, transforms[0] ); + v3_copy( player->rb.co, transforms[0][3] ); + + v4_copy( player->rb.q, animator->transforms[0].q ); + v3_copy( player->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->obj.rb.co, substep, co_int ); + q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int ); + v4_copy( part->obj.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 ); } } -VG_STATIC void player__dead_post_animate( player_instance *player ) -{ +VG_STATIC void player__dead_pose( player_instance *player, player_pose *pose ){ + struct player_dead *d = &player->_dead; + struct player_dead_animator *animator = &d->animator; + struct player_ragdoll *rd = &player->ragdoll; struct player_avatar *av = player->playeravatar; - struct player_dead *d = &player->_dead; + struct skeleton *sk = &av->sk; - copy_ragdoll_pose_to_avatar( &player->ragdoll, player->playeravatar ); - player->cam_velocity_influence = 1.0f; + pose->type = k_player_pose_type_fk_2; + pose->board.lean = 0.0f; - struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ]; + v3_copy( animator->transforms[0].co, pose->root_co ); + v4_copy( animator->transforms[0].q, pose->root_q ); - v3_lerp( d->co_lpf, part->rb.co, vg.frame_delta*4.0f, d->co_lpf ); - v3_lerp( d->v_lpf, part->rb.v, vg.frame_delta*4.0f, d->v_lpf ); - v3_lerp( d->w_lpf, part->rb.w, vg.frame_delta*4.0f, d->w_lpf ); - - v3_copy( d->co_lpf, player->rb.co ); - v3_copy( d->v_lpf, player->rb.v ); - v3_copy( d->w_lpf, player->rb.w ); + 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 ); + } } -VG_STATIC void player__dead_im_gui ( player_instance *player ) -{ +VG_STATIC void player__dead_post_animate( player_instance *player ){ + player->cam_velocity_influence = 1.0f; +} + +VG_STATIC void player__dead_im_gui ( player_instance *player ){ } -VG_STATIC void player__dead_transition ( player_instance *player ) -{ +VG_STATIC void player__dead_transition ( player_instance *player ){ player->subsystem = k_player_subsystem_dead; copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, player->rb.v ); @@ -55,9 +135,9 @@ VG_STATIC void player__dead_transition ( player_instance *player ) struct player_avatar *av = player->playeravatar; struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ]; struct player_dead *d = &player->_dead; - v3_copy( part->rb.co, d->co_lpf ); - v3_copy( part->rb.v, d->v_lpf ); - v3_copy( part->rb.w, d->w_lpf ); + v3_copy( part->obj.rb.co, d->co_lpf ); + v3_copy( part->obj.rb.v, d->v_lpf ); + v3_copy( part->obj.rb.w, d->w_lpf ); } #endif /* PLAYER_DEAD_C */