spin boost
authorhgn <hgodden00@gmail.com>
Thu, 26 Jan 2023 22:04:03 +0000 (22:04 +0000)
committerhgn <hgodden00@gmail.com>
Thu, 26 Jan 2023 22:04:03 +0000 (22:04 +0000)
common.h
player_device_skate.h

index 14bf294e9f9b430f9a6ac292e688acec1d8a8899..a7cb78fc7c1d89f490945cf9cfa0a3a7b69a481b 100644 (file)
--- a/common.h
+++ b/common.h
@@ -117,6 +117,8 @@ VG_STATIC float
    k_pitch_limit           = 1.5f,
    k_look_speed            = 2.0f,
 
+   k_spin_boost            = 1.5f,
+
    k_cog_spring            = 0.2f,
    k_cog_damp              = 0.02f,
    k_cog_mass_ratio        = 0.9f,
index af95a7ff1a4a0531d855f9e835290d31afeb4836..62c21210b9bd29fd9e89950ec57058c54fe51b59 100644 (file)
@@ -67,6 +67,8 @@ struct player_device_skate
    }
    predictions[22];
    u32 prediction_count;
+   float land_dist;
+   v3f land_normal;
 
    /* animation */
    struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
@@ -597,7 +599,7 @@ VG_STATIC void skate_apply_air_model( player_interface *player,
       {
          v4f correction;
          q_axis_angle( correction, axis, 
-                        acosf(angle)*(1.0f-limiter)*3.0f*VG_TIMESTEP_FIXED );
+                        acosf(angle)*(1.0f-limiter)*2.0f*VG_TIMESTEP_FIXED );
          q_mul( correction, player->rb.q, player->rb.q );
       }
    }
@@ -609,6 +611,8 @@ VG_STATIC void skate_apply_air_model( player_interface *player,
    s->state.steery -= steer[0] * k_steer_air * VG_TIMESTEP_FIXED;
    s->state.steerx += steer[1] * s->state.reverse * k_steer_air 
                                                          * limiter * k_rb_delta;
+   s->land_dist = time_to_impact;
+   v3_copy( target_normal, s->land_normal );
 }
 
 VG_STATIC void skate_get_board_points( player_interface *player,
@@ -710,12 +714,14 @@ VG_STATIC void skate_apply_interface_model( player_interface *player,
    float angle = -atan2f( dy, dx );
    q_axis_angle( s->board_rotation, (v3f){1.0f,0.0f,0.0f}, angle );
 
+   int lift_frames_limit = 1;
+
    /* Surface connection */
    if( len == 0 && !(spring_hit0 && spring_hit1) )
    {
       s->state.lift_frames ++;
 
-      if( s->state.lift_frames >= 8 )
+      if( s->state.lift_frames >= lift_frames_limit )
          s->state.activity = k_skate_activity_air;
    }
    else
@@ -731,7 +737,7 @@ VG_STATIC void skate_apply_interface_model( player_interface *player,
       {
          s->state.lift_frames ++;
 
-         if( s->state.lift_frames >= 8 )
+         if( s->state.lift_frames >= lift_frames_limit )
             s->state.activity = k_skate_activity_air;
       }
       else
@@ -894,6 +900,16 @@ VG_STATIC void skate_apply_jump_model( player_interface *player,
       s->state.jump_charge = 0.0f;
 
       s->state.jump_time = vg.time;
+
+      v2f steer = { player->input_js1h->axis.value,
+                    player->input_js1v->axis.value };
+      v2_normalize_clamp( steer );
+
+      float maxspin = k_steer_air * k_rb_delta * k_spin_boost;
+      s->state.steery_s = -steer[0] * maxspin;
+      s->state.steerx_s =  steer[1] * s->state.reverse * maxspin;
+      s->state.steerx = s->state.steerx_s;
+      s->state.steery = s->state.steery_s;
       
       /* FIXME audio events */
 #if 0
@@ -1161,6 +1177,9 @@ VG_STATIC void player_skate_ui( player_interface *player,
                                              "k_skate_activity_ground",
                                              "k_skate_activity_grind }" }
                                              [s->state.activity] );
+   player_debugtext( 1, "steer_s: %5.2f %5.2f [%.2f %.2f]\n",
+                        s->state.steerx_s, s->state.steery_s,
+                        k_steer_ground, k_steer_air );
 }
 
 VG_STATIC void player_skate_pose( player_interface *player,
@@ -1404,9 +1423,29 @@ VG_STATIC void player_skate_get_camera( player_interface *player,
    v3_zero( cam->angles );
    cam->fov = 119.0f;
 
-   /* TODO: smooth clamp lerp rate of change */
+   v3f flat_dir,
+       vel_dir,
+       look_dir;
+
+   v3_copy( player->rb.v, vel_dir );
+   v3_normalize( vel_dir );
+
+   float tti = s->land_dist;
+   v3f   norm;
+   v3_copy( s->land_normal, norm );
+
+   if( s->state.activity == k_skate_activity_ground )
+   {
+      tti = 0.0f;
+      v3_copy( player->rb.to_world[1], norm );
+   }
+
+
+   v3_muladds( vel_dir, norm, -v3_dot(vel_dir,norm), flat_dir );
+   v3_normalize( flat_dir );
 
-   v3_lerp( s->state.vl, player->rb.v, 5.0f*vg.time_delta, s->state.vl );
+   v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir );
+   v3_lerp( s->state.vl, look_dir, 8.0f*vg.time_delta, s->state.vl );
 
    float *v  = s->state.vl,
          yaw = atan2f( v[0], -v[2] ),