- float walk_norm = (float)w->anim_walk->length/30.0f,
- run_norm = (float)w->anim_run->length/30.0f,
- t = w->walk_timer,
- l = vg_clampf( w->blend_run*15.0f, 0.0f, 1.0f ),
- idle_walk = vg_clampf( (w->blend_run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f );
-
- /* walk/run */
- 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, w->blend_fly, apose );
-
- /* Create transform */
- rb_extrapolate( &player->rb, dest->root_co, dest->root_q );
-
- float walk_yaw = player_get_heading_yaw( player );
-
- if( w->state.outro_anim )
- {
- struct player_avatar *av = player->playeravatar;
- float outro_length = (float)w->state.outro_anim->length /
- w->state.outro_anim->rate,
- outro_time = vg.time - w->state.outro_start_time,
- outro_t = outro_time / outro_length;
-
- /* TODO: Compression */
- skeleton_sample_anim_clamped( sk, w->state.outro_anim,
- outro_time, bpose );
- skeleton_lerp_pose( sk, apose, bpose, outro_t * 10.0f, dest->pose );
-
- if( w->state.outro_type == k_walk_outro_drop_in )
- {
- float inv_rate = 1.0f / w->state.outro_anim->rate,
- anim_frames = w->state.outro_anim->length * inv_rate,
+ f32 walk_yaw = player_get_heading_yaw();
+ if( w->state.outro_type ){
+ struct player_avatar *av = localplayer.playeravatar;
+ 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,