From 6e9b9e12e1f9da0419cd4d89707c7d599512d3b8 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 28 Mar 2023 18:24:06 +0100 Subject: [PATCH] forsenRun --- common.h | 2 +- player_skate.c | 117 +++++++++++++++++++++++++++++-------------------- player_skate.h | 3 +- 3 files changed, 73 insertions(+), 49 deletions(-) diff --git a/common.h b/common.h index 19b5a6f..fbcb7cf 100644 --- a/common.h +++ b/common.h @@ -77,7 +77,7 @@ VG_STATIC float k_board_interia = 8.0f, k_grind_decayxy = 30.0f, - k_grind_axel_min_vel = 3.0f, + k_grind_axel_min_vel = 1.0f, k_grind_axel_max_angle = 0.95f, /* cosine(|a|) */ k_grind_axel_max_vangle = 0.4f, k_grind_max_friction = 3.0f, diff --git a/player_skate.c b/player_skate.c index 25f8724..7a661cf 100644 --- a/player_skate.c +++ b/player_skate.c @@ -321,6 +321,8 @@ VG_STATIC int create_jumps_to_hit_target( player_instance *player, m3x3_mulv( player->basis, inf->v, inf->v ); inf->land_dist = d[0] / (cosf(a0)*m); inf->gravity = gravity; + + v3_copy( target, inf->log[inf->log_length ++] ); } if( fabsf(a1-a) < max_angle_delta ){ @@ -332,6 +334,8 @@ VG_STATIC int create_jumps_to_hit_target( player_instance *player, m3x3_mulv( player->basis, inf->v, inf->v ); inf->land_dist = d[0] / (cosf(a1)*m); inf->gravity = gravity; + + v3_copy( target, inf->log[inf->log_length ++] ); } } @@ -510,6 +514,11 @@ void player__approximate_best_trajectory( player_instance *player ) v3_cross( v0, v1, inf->n ); v3_normalize( inf->n ); #endif + /* TODO: + * grind predictions, we want to FORCE it to land in the correct + * location, taking the cloest endpoint or midpoint to be the + * snapper. + */ inf->type = k_prediction_land; @@ -543,7 +552,16 @@ void player__approximate_best_trajectory( player_instance *player ) int valid_count = create_jumps_to_hit_target( player, grind_jumps, grind.co, - 0.25f*VG_PIf, grind_located_gravity ); + 0.175f*VG_PIf, grind_located_gravity ); + + /* knock out original landing points in the 1m area + * TODO: Make this a konstant */ + for( u32 j=0; jpossible_jump_count; j++ ){ + jump_info *jump = &s->possible_jumps[ j ]; + float dist = v3_dist2( jump->log[jump->log_length-1], grind.co ); + float descale = 1.0f-vg_minf(1.0f,dist); + jump->score += descale*3.0f; + } for( int i=0; igravity * t*t, co0 ); v3_add( launch_co, co0, co0 ); +#if 0 /* rough scan to make sure we dont collide with anything */ for( int j=1; j<=16; j++ ){ t = (float)j*(1.0f/16.0f); @@ -584,6 +603,7 @@ void player__approximate_best_trajectory( player_instance *player ) v3_copy( co1, co0 ); } +#endif v3_copy( grind.n, jump->n ); @@ -595,8 +615,10 @@ void player__approximate_best_trajectory( player_instance *player ) s->possible_jumps[ s->possible_jump_count ++ ] = *jump; +#if 0 continue; invalidated_grind:; +#endif } } @@ -645,6 +667,10 @@ invalidated_grind:; v2_normalize_clamp( steer ); s->state.gravity_bias = best->gravity; + if( best->type == k_prediction_grind ){ + s->state.activity = k_skate_activity_air_to_grind; + } + if( (fabsf(steer[1]) > 0.5f) && (s->land_dist >= 1.5f) ){ s->state.flip_rate = (1.0f/s->land_dist) * vg_signf(steer[1]) * s->state.reverse ; @@ -674,7 +700,7 @@ VG_STATIC void skate_apply_air_model( player_instance *player ) { struct player_skate *s = &player->_skate; - if( s->state.activity_prev != k_skate_activity_air ) + if( s->state.activity_prev > k_skate_activity_air_to_grind ) player__approximate_best_trajectory( player ); float angle = v3_dot( player->rb.to_world[1], s->land_normal ); @@ -710,7 +736,7 @@ VG_STATIC void skate_apply_trick_model( player_instance *player ) v3_muladds( s->board_trick_residuald, s->board_trick_residualv, k_rb_delta, s->board_trick_residuald ); - if( s->state.activity == k_skate_activity_air ){ + if( s->state.activity <= k_skate_activity_air_to_grind ){ if( v3_length2( s->state.trick_vel ) < 0.0001f ) return; @@ -797,7 +823,7 @@ VG_STATIC void skate_apply_steering_model( player_instance *player ) float rate = 26.0f, top = 1.0f; - if( s->state.activity == k_skate_activity_air ){ + if( s->state.activity <= k_skate_activity_air_to_grind ){ rate = 6.0f * fabsf(steer); top = 1.5f; } @@ -899,7 +925,7 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) s->state.charging_jump = player->input_jump->button.value; /* Cannot charge this in air */ - if( s->state.activity == k_skate_activity_air ){ + if( s->state.activity <= k_skate_activity_air_to_grind ){ s->state.charging_jump = 0; return; } @@ -933,25 +959,25 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) v3_normalize( jumpdir ); }else{ v3_copy( s->state.up_dir, jumpdir ); + s->state.activity = k_skate_activity_ground; + s->grind_cooldown = 0; + + float tilt = player->input_js1h->axis.value * 0.3f; + tilt *= vg_signf(v3_dot( player->rb.v, s->grind_dir )); + + v4f qtilt; + q_axis_angle( qtilt, s->grind_dir, tilt ); + q_mulv( qtilt, jumpdir, jumpdir ); } float force = k_jump_force*s->state.jump_charge; v3_muladds( player->rb.v, jumpdir, force, player->rb.v ); s->state.jump_charge = 0.0f; s->state.jump_time = vg.time; - s->state.activity = k_skate_activity_air; v2f steer = { player->input_js1h->axis.value, player->input_js1v->axis.value }; v2_normalize_clamp( steer ); - skate_apply_air_model( player ); - -#if 0 - float maxspin = k_steer_air * k_rb_delta * k_spin_boost; - s->state.steery_s = -steer[0] * maxspin; - s->state.steerx = s->state.steerx_s; - s->state.lift_frames ++; -#endif audio_lock(); audio_oneshot_3d( &audio_jumps[rand()%2], player->rb.co, 40.0f, 1.0f ); @@ -1103,7 +1129,7 @@ VG_STATIC void player__skate_pre_update( player_instance *player ) } int trick_id; - if( (s->state.activity == k_skate_activity_air) && + if( (s->state.activity <= k_skate_activity_air_to_grind) && (trick_id = player_skate_trick_input( player )) ) { if( (vg.time - s->state.jump_time) < 0.1f ){ @@ -1130,6 +1156,10 @@ VG_STATIC void player__skate_post_update( player_instance *player ) for( int i=0; ipossible_jump_count; i++ ){ jump_info *jump = &s->possible_jumps[i]; + + if( jump->log_length == 0 ){ + vg_fatal_exit_loop( "assert: jump->log_length == 0\n" ); + } for( int j=0; jlog_length - 1; j ++ ){ float brightness = jump->score*jump->score*jump->score; @@ -1153,7 +1183,7 @@ VG_STATIC void player__skate_post_update( player_instance *player ) audio_lock(); - float air = s->state.activity == k_skate_activity_air? 1.0f: 0.0f, + float air = s->state.activity <= k_skate_activity_air_to_grind? 1.0f: 0.0f, speed = v3_length( player->rb.v ), attn = vg_minf( 1.0f, speed*0.1f ), slide = vg_clampf( fabsf(s->state.slip), 0.0f, 1.0f ), @@ -1420,13 +1450,11 @@ VG_STATIC void skate_adjust_up_direction( player_instance *player ) v3_lerp( s->state.up_dir, target, 8.0f * s->substep_delta, s->state.up_dir ); } - else if( s->state.activity == k_skate_activity_air ) - { + else if( s->state.activity <= k_skate_activity_air_to_grind ){ v3_lerp( s->state.up_dir, player->rb.to_world[1], 8.0f * s->substep_delta, s->state.up_dir ); } - else - { + else{ v3_lerp( s->state.up_dir, player->basis[1], 12.0f * s->substep_delta, s->state.up_dir ); } @@ -1793,7 +1821,7 @@ VG_STATIC int skate_boardslide_entry( player_instance *player, if( (fabsf(local_co[2]) <= k_board_length) && /* within wood area */ (local_co[1] >= 0.0f) && /* at deck level */ - (fabsf(local_dir[0]) >= 0.5f) ) /* perpendicular to us */ + (fabsf(local_dir[0]) >= 0.25f) ) /* perpendicular to us */ { if( fabsf(v3_dot( player->rb.v, inf->dir )) < k_grind_axel_min_vel ) return 0; @@ -1857,9 +1885,8 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player ) struct player_skate *s = &player->_skate; /* debounces this state manager a little bit */ - if( s->frames_since_activity_change < 10 ) - { - s->frames_since_activity_change ++; + if( s->grind_cooldown < 20 ){ + s->grind_cooldown ++; return k_skate_activity_undefined; } @@ -1871,33 +1898,27 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player ) res_front50 = 0, res_slide = 0; - if( s->state.activity == k_skate_activity_grind_boardslide ) - { + if( s->state.activity == k_skate_activity_grind_boardslide ){ res_slide = skate_boardslide_renew( player, &inf_slide ); } - else if( s->state.activity == k_skate_activity_grind_back50 ) - { + else if( s->state.activity == k_skate_activity_grind_back50 ){ res_back50 = skate_grind_truck_renew( player, 1.0f, &inf_back50 ); res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 ); } - else if( s->state.activity == k_skate_activity_grind_front50 ) - { + else if( s->state.activity == k_skate_activity_grind_front50 ){ res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 ); res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 ); } - else if( s->state.activity == k_skate_activity_grind_5050 ) - { + else if( s->state.activity == k_skate_activity_grind_5050 ){ res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 ); res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 ); } - else - { + else{ res_slide = skate_boardslide_entry( player, &inf_slide ); res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 ); res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 ); - if( res_back50 != res_front50 ) - { + if( res_back50 != res_front50 ){ int wants_to_do_that = fabsf(player->input_js1v->axis.value) >= 0.25f; res_back50 &= wants_to_do_that; @@ -1922,8 +1943,10 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player ) if( new_activity == k_skate_activity_undefined ) { +#if 0 if( s->state.activity >= k_skate_activity_grind_any ) s->frames_since_activity_change = 0; +#endif } else if( new_activity == k_skate_activity_grind_boardslide ) { @@ -1988,7 +2011,7 @@ VG_STATIC void player__skate_update( player_instance *player ) float slap = 0.0f; - if( s->state.activity == k_skate_activity_air ){ + if( s->state.activity <= k_skate_activity_air_to_grind ){ float min_dist = 0.6f; for( int i=0; i<2; i++ ){ @@ -2000,14 +2023,11 @@ VG_STATIC void player__skate_update( player_instance *player ) } } min_dist -= 0.2f; - float o = vg_clampf( min_dist/0.5f, 0.0f, 1.0f ); + float vy = v3_dot( player->basis[1], player->rb.v ); + vy = vg_maxf( 0.0f, vy ); -#if 0 - float jump_t = vg.time - s->state.jump_time; - jump_t = vg_minf( o, 1.0f ); -#endif + slap = vg_clampf( (min_dist/0.5f) + vy, 0.0f, 1.0f )*0.3f; - slap = o*0.3f;//vg_minf((1.0f-fabsf(2.0f*jump_t-1.0f))*8.0f,1.0f) * 0.3f; wheels[0].pos[1] = slap; wheels[1].pos[1] = slap; } @@ -2069,7 +2089,9 @@ VG_STATIC void player__skate_update( player_instance *player ) skate_weight_distribute( player ); } else{ - s->state.activity = k_skate_activity_air; + if( s->state.activity > k_skate_activity_air_to_grind ) + s->state.activity = k_skate_activity_air; + v3_zero( s->weight_distribution ); skate_apply_air_model( player ); } @@ -2446,6 +2468,7 @@ VG_STATIC void player__skate_im_gui( player_instance *player ) const char *activity_txt[] = { "air", + "air_to_grind", "ground", "undefined (INVALID)", "grind_any (INVALID)", @@ -2532,7 +2555,7 @@ VG_STATIC void player__skate_animate( player_instance *player, /* movement information */ { - int iair = s->state.activity == k_skate_activity_air; + int iair = s->state.activity <= k_skate_activity_air_to_grind; float dirz = s->state.reverse > 0.0f? 0.0f: 1.0f, dirx = s->state.slip < 0.0f? 0.0f: 1.0f, @@ -2772,7 +2795,7 @@ VG_STATIC void player__skate_animate( player_instance *player, float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f ); v4f qflip; - if( (s->state.activity == k_skate_activity_air) && + if( (s->state.activity <= k_skate_activity_air_to_grind) && (fabsf(s->state.flip_rate) > 0.01f) ) { float t = s->state.flip_time; @@ -2819,7 +2842,7 @@ VG_STATIC void player__skate_reset_animator( player_instance *player ) { struct player_skate *s = &player->_skate; - if( s->state.activity == k_skate_activity_air ) + if( s->state.activity <= k_skate_activity_air_to_grind ) s->blend_fly = 1.0f; else s->blend_fly = 0.0f; diff --git a/player_skate.h b/player_skate.h index d4900dd..ee1a236 100644 --- a/player_skate.h +++ b/player_skate.h @@ -14,6 +14,7 @@ struct player_skate enum skate_activity { k_skate_activity_air, + k_skate_activity_air_to_grind, k_skate_activity_ground, k_skate_activity_undefined, k_skate_activity_grind_any, @@ -147,7 +148,7 @@ struct player_skate grind_vec, grind_dir; - u32 frames_since_activity_change; + u32 grind_cooldown; float grind_strength; -- 2.25.1