+ else
+ localplayer.cam_velocity_influence = 0.0f;
+
+ if( w->state.activity == k_walk_activity_sit ){
+ localplayer.cam_dist = 3.8f;
+ }
+ else {
+ localplayer.cam_dist = 1.8f;
+ }
+}
+
+static void player_walk_pose_sit( struct player_walk_animator *animator,
+ player_pose *pose ){
+ mdl_keyframe bpose[32];
+
+ struct player_walk *w = &player_walk;
+ struct skeleton *sk = &localplayer.skeleton;
+
+ f32 t = animator->transition_t,
+ st = t * ((f32)(w->anim_sit->length-1)/30.0f);
+ skeleton_sample_anim( sk, w->anim_sit, st, bpose );
+
+ v4f qy,qp;
+ f32 *qh = bpose[localplayer.id_head-1].q;
+ q_axis_angle( qy, (v3f){0,1,0}, animator->yaw*0.5f*t );
+ q_axis_angle( qp, (v3f){0,0,1}, animator->pitch*t );
+ q_mul( qy, qh, qh );
+ q_mul( qh, qp, qh );
+ q_normalize( qh );
+
+ qh = bpose[localplayer.id_chest-1].q;
+ q_axis_angle( qy, (v3f){0,1,0}, animator->yaw*0.5f*t );
+ q_mul( qy, qh, qh );
+ q_normalize( qh );
+
+ skeleton_lerp_pose( sk, pose->keyframes, bpose,
+ vg_minf(1.0f,t*10.0f), pose->keyframes );
+}
+
+enum walk_transition_type {
+ k_walk_transition_in,
+ k_walk_transition_out,
+ k_walk_transition_outin,
+};
+
+static void player_walk_pose_transition(
+ struct player_walk_animator *animator, struct skeleton_anim *anim,
+ enum walk_transition_type type,
+ mdl_keyframe apose[32], f32 *mask, player_pose *pose ){
+
+ mdl_keyframe bpose[32];
+
+ struct player_walk *w = &player_walk;
+ struct skeleton *sk = &localplayer.skeleton;
+
+ f32 length = (f32)(anim->length-1) / anim->rate,
+ t = animator->transition_t * length,
+ blend = 1.0f;
+
+ if( type == k_walk_transition_in || type == k_walk_transition_outin )
+ blend = vg_minf( blend, length-t );
+
+ if( type == k_walk_transition_out || type == k_walk_transition_outin )
+ blend = vg_minf( blend, t );
+
+ blend = vg_smoothstepf( vg_minf(1,blend/k_anim_transition) );
+
+ skeleton_sample_anim_clamped( sk, anim, t, bpose );
+
+ mdl_keyframe *kf_board = &bpose[localplayer.id_board-1];
+ f32 yaw = animator->board_yaw * VG_TAUf * 0.5f;
+
+ v4f qyaw;
+ q_axis_angle( qyaw, (v3f){0,1,0}, yaw );
+ q_mul( kf_board->q, qyaw, kf_board->q );
+ q_normalize( kf_board->q );
+
+ if( mask ){
+ for( i32 i=0; i<sk->bone_count-1; i ++ )
+ keyframe_lerp( apose+i, bpose+i, blend*mask[i], pose->keyframes+i );
+ }
+ else
+ skeleton_lerp_pose( sk, apose, bpose, blend, pose->keyframes );
+}
+
+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;