+ fstand = vg_lerpf(fstand, 1.0f-vg_clampf(speed*0.03f,0.0f,1.0f),0.1f);
+ fslide = vg_lerpf(fslide, vg_clampf(lslip+fabsf(offset[0])*0.2f,
+ 0.0f,1.0f), 0.04f);
+ fdirz = vg_lerpf(fdirz, player.reverse > 0.0f? 1.0f: 0.0f, 0.04f );
+ fdirx = vg_lerpf(fdirx, player.slip < 0.0f? 1.0f: 0.0f, 0.04f );
+ ffly = vg_lerpf(ffly, player.in_air? 1.0f: 0.0f, 0.04f );
+
+ character_pose_reset( &player.mdl );
+
+ float amt_air = ffly*ffly,
+ amt_ground = 1.0f-amt_air,
+ amt_std = (1.0f-fslide) * amt_ground,
+ amt_stand = amt_std * fstand,
+ amt_aero = amt_std * (1.0f-fstand),
+ amt_slide = amt_ground * fslide;
+
+ character_final_pose( &player.mdl, offset, &pose_stand, amt_stand );
+ character_final_pose( &player.mdl, offset, &pose_aero, amt_aero*fdirz );
+ character_final_pose( &player.mdl, offset,
+ &pose_aero_reverse, amt_aero * (1.0f-fdirz) );
+ character_final_pose( &player.mdl, offset, &pose_slide, amt_slide*fdirx );
+ character_final_pose( &player.mdl, offset,
+ &pose_slide1, amt_slide*(1.0f-fdirx) );
+
+ character_final_pose( &player.mdl, (v3f){0.0f,0.0f,0.0f},
+ &pose_fly, amt_air );
+
+ if( !freecam )
+ {
+ v3_copy( player.mdl.cam_pos, player.view );
+ v3_muladds( player.view, offset, 0.7f, player.view );
+ player.view[1] = vg_clampf( player.view[1], 0.3f, kheight );
+ }
+
+ /*
+ * Additive effects
+ * ==========================
+ */
+ struct ik_basic *arm_l = &player.mdl.ik_arm_l,
+ *arm_r = &player.mdl.ik_arm_r;
+
+ v3f localv;
+ m3x3_mulv( player.to_local, player.v, localv );
+ v3_muladds( arm_l->end, localv, -0.01f, arm_l->end );
+ v3_muladds( arm_r->end, localv, -0.01f, arm_r->end );
+
+ /* New board transformation */
+ v4f board_rotation; v3f board_location;
+
+ v4f rz, rx;
+ q_axis_angle( rz, (v3f){ 0.0f, 0.0f, 1.0f }, player.board_xy[0] );
+ q_axis_angle( rx, (v3f){ 1.0f, 0.0f, 0.0f }, player.board_xy[1] );
+ q_mul( rx, rz, board_rotation );