+ else{
+ v3_muladds( animator->root_co, player->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 );
+ q_mul( player->qbasis, animator->root_q, animator->root_q );
+ q_normalize( animator->root_q );
+}
+
+VG_STATIC void player__walk_pose( player_instance *player, player_pose *pose ){
+ struct player_walk *w = &player->_walk;
+ struct player_walk_animator *animator = &w->animator;
+ struct skeleton *sk = &player->playeravatar->sk;
+ struct player_avatar *av = player->playeravatar;
+
+ 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;
+
+ float walk_norm = (float)w->anim_walk->length/30.0f,
+ run_norm = (float)w->anim_run->length/30.0f,
+ t = animator->walk_timer,
+ l = vg_clampf( animator->run*15.0f, 0.0f, 1.0f ),
+ idle_walk = vg_clampf( (animator->run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f );
+
+ /* walk/run */
+ mdl_keyframe apose[32], bpose[32];
+ skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose );
+ skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose );
+
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+
+ /* idle */
+ skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose );
+
+ /* air */
+ skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, animator->fly, apose );