- /* Camera position */
- static v3f last_vel = { 0.0f, 0.0f, 0.0f };
- static v3f momentum, bob;
-
- v3_sub( player.v, last_vel, player.a );
- v3_copy( player.v, last_vel );
-
- v3_add( momentum, player.a, momentum );
- v3_lerp( momentum, (v3f){0.0f,0.0f,0.0f}, 0.1f, momentum );
- v3f target;
-
- momentum[0] = vg_clampf( momentum[0], -2.0f, 2.0f );
- momentum[1] = vg_clampf( momentum[1], -0.2f, 5.0f );
- momentum[2] = vg_clampf( momentum[2], -2.0f, 2.0f );
- v3_copy( momentum, target );
- v3_lerp( bob, target, 0.2f, bob );
-
- /* Head */
- float lslip = fabsf(player.slip); //vg_minf( 0.4f, slip );
-
- float grabt = vg_get_axis( "grabr" )*0.5f+0.5f;
- player.grab = vg_lerpf( player.grab, grabt, 0.04f );
-
- float kheight = 2.0f,
- kleg = 0.6f;
-
- v3f head;
- head[0] = 0.0f;
- head[1] = (0.3f+cosf(lslip)*0.5f*(1.0f-player.grab*0.7f)) * kheight;
- head[2] = 0.0f;
-
- v3f offset;
- m3x3_mulv( player.to_local, bob, offset );
-
- offset[0] *= 0.3333f;
- offset[1] *= -0.25f;
- offset[2] *= 0.7f;
- v3_muladds( head, offset, 0.7f, head );
- head[1] = vg_clampf( head[1], 0.3f, kheight );
-
- v3_copy( head, player.view );
- v3f camoffs = {-0.2f,-0.6f,0.00f};
- v3_add( player.view, camoffs, player.view );
-
-
- /*
- * Animation blending
- * ===========================================
- */
-
- static float fslide = 0.0f;
- static float fdirz = 0.0f;
- static float fdirx = 0.0f;
- static float fstand = 0.0f;
- static float ffly = 0.0f;
-
- float speed = v3_length( player.v );
-
- 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_pose_with_tilt( &player.mdl, offset,
- &character_pose_stand, amt_stand );
-
- character_pose_with_tilt( &player.mdl, offset,
- &character_pose_aero, amt_aero * fdirz );
- character_pose_with_tilt( &player.mdl, offset,
- &character_pose_aero_reverse, amt_aero * (1.0f-fdirz) );
-
- character_pose_with_tilt( &player.mdl, offset,
- &character_pose_slide, amt_slide*fdirx );
- character_pose_with_tilt( &player.mdl, offset,
- &character_pose_slide1, amt_slide*(1.0f-fdirx) );
-
- character_pose_with_tilt( &player.mdl, (v3f){0.0f,0.0f,0.0f},
- &character_pose_fly, amt_air );
-
-
-
- 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;