animation board tweaks
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index 8598f20d7a1c85943b028529c58f2ba37afec053..a796b7c67ee721c2ecfdb528f4bddf78691480f3 100644 (file)
@@ -714,7 +714,7 @@ VG_STATIC void skate_apply_air_model( player_instance *player )
    q_mul( correction, player->rb.q, player->rb.q );
 }
 
-VG_STATIC int player_skate_trick_input( player_instance *player );
+VG_STATIC enum trick_type player_skate_trick_input( player_instance *player );
 VG_STATIC void skate_apply_trick_model( player_instance *player )
 {
    struct player_skate *s = &player->_skate;
@@ -1108,7 +1108,7 @@ VG_STATIC void skate_copy_holdout( player_instance *player )
    skeleton_copy_pose( sk, s->holdout, player->holdout_pose );
 }
 
-VG_STATIC int player_skate_trick_input( player_instance *player )
+VG_STATIC enum trick_type player_skate_trick_input( player_instance *player )
 {
    return (button_press( k_srbind_trick0 )     ) |
           (button_press( k_srbind_trick1 ) << 1) |
@@ -1134,24 +1134,25 @@ VG_STATIC void player__skate_pre_update( player_instance *player )
       return;
    }
 
-   int trick_id; 
+   enum trick_type trick = k_trick_type_none;
    if( (s->state.activity <= k_skate_activity_air_to_grind) && 
-       (trick_id = player_skate_trick_input( player )) )
+       (trick = player_skate_trick_input( player )) )
    {
       if( (vg.time - s->state.jump_time) < 0.1f ){
          v3_zero( s->state.trick_vel );
          s->state.trick_time = 0.0f;
 
-         if( trick_id == 1 ){
+         if( trick == k_trick_type_kickflip ){
             s->state.trick_vel[0] = 3.0f;
          }
-         else if( trick_id == 2 ){
+         else if( trick == k_trick_type_shuvit ){
             s->state.trick_vel[2] = 3.0f;
          }
-         else if( trick_id == 3 ){
+         else if( trick == k_trick_type_treflip ){
             s->state.trick_vel[0] = 2.0f;
             s->state.trick_vel[2] = 2.0f;
          }
+         s->state.trick_type = trick;
       }
    }
 }
@@ -2714,7 +2715,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
    offset[0]=vg_clampf(offset[0],-0.8f,0.8f)*(1.0f-fabsf(s->blend_slide)*0.9f);
    offset[1]=vg_clampf(offset[1],-0.5f,0.0f);
 
-   v3_muls( offset, 0.3f, TEMP_TPV_EXTRA );
+   v3_muls( offset, 0.3f, player->tpv_offset_extra );
 
    /* 
     * Animation blending
@@ -2759,9 +2760,29 @@ VG_STATIC void player__skate_animate( player_instance *player,
       float dir_frame   = s->blend_z * (15.0f/30.0f),
             stand_blend = offset[1]*-2.0f;
 
+      v2f steer;
+      joystick_state( k_srjoystick_steer, steer );
+      f32 lean1,
+          lean2 = steer[0] * s->state.reverse * -0.36f,
+          lean;
+
+      if( fabsf(s->state.slip) > 0.3f ){
+         f32 slide_dir = vg_signf(v3_dot(player->rb.v,player->rb.to_world[0]));
+         s->state.delayed_slip_dir = slide_dir;
+      }
+      lean1 = s->blend_slide * s->state.delayed_slip_dir;
+
+      if( fabsf(lean1)>fabsf(lean2) ) lean = lean1;
+      else                            lean = lean2;
+
+      if( ((int)roundf(s->state.trick_euler[0])) % 2 ) lean = -lean;
+      lean = vg_clampf( lean, -1.0f, 1.0f );
+
+      player->board_pose.lean = vg_lerpf( player->board_pose.lean, lean,
+                                          vg.time_delta * 18.0f );
+
       v3f local_cog;
       m4x3_mulv( player->rb.to_local, s->state.cog, local_cog );
-
       stand_blend = vg_clampf( 1.0f-local_cog[1], 0, 1 );
 
       skeleton_sample_anim( sk, s->anim_stand, dir_frame, apose );
@@ -2976,7 +2997,6 @@ VG_STATIC void player__skate_animate( player_instance *player,
 
       q_mul( qtotal, kf_board->q, kf_board->q );
 
-
       /* trick rotation */
       v4f qtrick, qyaw, qpitch, qroll;
       v3f euler;
@@ -3028,6 +3048,25 @@ VG_STATIC void player__skate_animate( player_instance *player,
       kf_board->co[1] += s->state.slap * s->subslap;
       kf_hip->co[1] += s->state.slap * 0.25f;
 
+
+      f32 l = ((s->state.activity < k_skate_activity_ground) &&
+                v3_length2(s->state.trick_vel) > 0.1f )? 1: 0;
+      s->blend_trick_foot = vg_lerpf( s->blend_trick_foot, l,  
+                                      8.4f*vg.time_delta );
+
+      if( s->state.trick_type == k_trick_type_kickflip ){
+         kf_foot_l->co[0] += s->blend_trick_foot * 0.2f;
+      }
+      else if( s->state.trick_type == k_trick_type_shuvit ){
+         kf_foot_l->co[0] += s->blend_trick_foot * 0.1f;
+         kf_foot_r->co[0] -= s->blend_trick_foot * 0.15f;
+      }
+      else if( s->state.trick_type == k_trick_type_treflip ){
+         kf_foot_l->co[0] += s->blend_trick_foot * 0.2f;
+         kf_foot_r->co[0] -= s->blend_trick_foot * 0.15f;
+      }
+
+
       /* 
        * animation wishlist:
        *    boardslide/grind jump animations
@@ -3036,8 +3075,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
        */
 
       /* truck rotation */
-      for( int i=0; i<2; i++ )
-      {
+      for( int i=0; i<2; i++ ){
          float a = vg_minf( s->truckv0[i][0], 1.0f );
          a = -acosf( a ) * vg_signf( s->truckv0[i][1] );