From 03aada77bbf0d268216a4ace0281ccb97ea9a409 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 26 Jan 2023 22:04:03 +0000 Subject: [PATCH] spin boost --- common.h | 2 ++ player_device_skate.h | 49 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/common.h b/common.h index 14bf294..a7cb78f 100644 --- 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, diff --git a/player_device_skate.h b/player_device_skate.h index af95a7f..62c2121 100644 --- a/player_device_skate.h +++ b/player_device_skate.h @@ -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] ), -- 2.25.1