+ if( w->state.outro_type ){
+ struct skeleton_anim *anim =
+ player_walk_outro_anim( w->state.outro_type );
+ f32 outro_length = (f32)anim->length / anim->rate,
+ outro_time = vg.time - w->state.outro_start_time;
+ animator->outro_t = outro_time / outro_length;
+
+ if( w->state.outro_type == k_walk_outro_drop_in ){
+ float inv_rate = 1.0f / anim->rate,
+ anim_frames = anim->length * inv_rate,
+ step_frames = 12.0f * inv_rate,
+ commit_frames = 6.0f * inv_rate,
+ drop_frames = anim_frames - step_frames,
+ step_t = vg_minf( 1.0f, outro_time / step_frames ),
+ remaind_time = vg_maxf( 0.0f, outro_time - step_frames ),
+ dop_t = vg_minf( 1.0f, remaind_time / drop_frames );
+ animator->commit_t = vg_minf( 1.0f, remaind_time / commit_frames );
+
+ walk_yaw = vg_alerpf( w->state.drop_in_start_angle,
+ w->state.drop_in_angle, step_t );
+
+ v3_lerp( w->state.drop_in_start, w->state.drop_in_target,
+ step_t, localplayer.rb.co );
+ v3_copy( localplayer.rb.co, animator->root_co );
+
+ /* for the camera purposes only */
+ v3f init_velocity;
+ player_walk_drop_in_vector( init_velocity );
+ v3_muls( init_velocity, dop_t, localplayer.rb.v );
+ v3_copy( localplayer.rb.v,
+ localplayer.cam_control.cam_velocity_smooth );
+
+ q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f},
+ walk_yaw + VG_PIf );
+
+ v3_copy( w->state.drop_in_foot_anchor, animator->foot_anchor );
+
+ /* the drop in bit */
+ if( step_t >= 1.0f ){
+ v3f final_co;
+ v4f final_q;
+ player_walk_drop_in_overhang_transform( dop_t, final_co, final_q );
+
+ q_mul( final_q, animator->root_q, animator->root_q );
+ v3_copy( final_co, animator->root_co );
+
+
+ v4_copy( animator->root_q, localplayer.rb.q );
+ rb_update_transform( &localplayer.rb );
+
+ v3_muladds( animator->root_co, localplayer.rb.to_world[1],
+ -0.1f*dop_t, animator->root_co );
+ v3_copy( animator->root_co, localplayer.rb.co );
+ }
+
+ return;
+ }
+ else{
+ v3_muladds( animator->root_co, localplayer.rb.to_world[1],
+ -0.1f*animator->outro_t, animator->root_co );
+ }
+ }
+
+ q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f}, walk_yaw + VG_PIf );
+}
+
+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.skeleton;
+
+ v3_copy( animator->root_co, pose->root_co );
+ v4_copy( animator->root_q, pose->root_q );
+ pose->board.lean = 0.0f;
+ pose->type = k_player_pose_type_ik;
+