From 9d5997f1e611b66c7220f7eb388f427032d8da79 Mon Sep 17 00:00:00 2001 From: hgn Date: Wed, 29 Mar 2023 11:21:18 +0100 Subject: [PATCH] dont remember --- player_common.c | 9 ++-- player_skate.c | 128 ++++++++++++++++++++++++++++++++++-------------- player_skate.h | 7 +-- 3 files changed, 99 insertions(+), 45 deletions(-) diff --git a/player_common.c b/player_common.c index 29ae050..e0343a0 100644 --- a/player_common.c +++ b/player_common.c @@ -57,21 +57,22 @@ VG_STATIC void player_camera_portal_correction( player_instance *player ) } } +static v3f TEMP_TPV_EXTRA; + VG_STATIC void player__cam_iterate( player_instance *player ) { struct player_avatar *av = player->playeravatar; - if( player->subsystem == k_player_subsystem_walk ) - { + if( player->subsystem == k_player_subsystem_walk ){ v3_copy( (v3f){-0.1f,1.8f,0.0f}, player->fpv_viewpoint ); v3_copy( (v3f){0.0f,0.0f,0.0f}, player->fpv_offset ); v3_copy( (v3f){0.0f,1.4f,0.0f}, player->tpv_offset ); } - else - { + else{ v3_copy( (v3f){0.0f,1.8f,0.0f}, player->fpv_viewpoint ); v3_copy( (v3f){-0.35f,0.0f,0.0f}, player->fpv_offset ); v3_copy( (v3f){0.0f,1.4f,0.0f}, player->tpv_offset ); + v3_add( TEMP_TPV_EXTRA, player->tpv_offset, player->tpv_offset ); } player->cam_velocity_constant = 0.25f; diff --git a/player_skate.c b/player_skate.c index 7a661cf..3a78f4f 100644 --- a/player_skate.c +++ b/player_skate.c @@ -1943,10 +1943,8 @@ 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 + s->grind_cooldown = 5; } else if( new_activity == k_skate_activity_grind_boardslide ) { @@ -2027,14 +2025,11 @@ VG_STATIC void player__skate_update( player_instance *player ) vy = vg_maxf( 0.0f, vy ); slap = vg_clampf( (min_dist/0.5f) + vy, 0.0f, 1.0f )*0.3f; - - wheels[0].pos[1] = slap; - wheels[1].pos[1] = slap; } - s->slap = slap; - - + s->state.slap = vg_lerpf( s->state.slap, slap, 10.0f*k_rb_delta ); + wheels[0].pos[1] = s->state.slap; + wheels[1].pos[1] = s->state.slap; @@ -2262,7 +2257,7 @@ begin_collision:; v3_muls( player->rb.to_world[2], -1.0f, mtx[1] ); v3_muls( player->rb.to_world[1], 1.0f, mtx[2] ); v3_muladds( player->rb.to_world[3], player->rb.to_world[1], - grind_radius + k_board_radius*0.25f+slap, mtx[3] ); + grind_radius + k_board_radius*0.25f+s->state.slap, mtx[3] ); rb_ct *cman = &manifold[manifold_len]; @@ -2423,6 +2418,8 @@ begin_collision:; v4f transport_rotation; m3x3_q( gate->transport, transport_rotation ); q_mul( transport_rotation, player->rb.q, player->rb.q ); + q_mul( transport_rotation, s->state.smoothed_rotation, + s->state.smoothed_rotation ); rb_update_transform( &player->rb ); s->state_gate_storage = s->state; @@ -2542,6 +2539,8 @@ 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 ); + /* * Animation blending * =========================================== @@ -2549,7 +2548,10 @@ VG_STATIC void player__skate_animate( player_instance *player, /* sliding */ { - float desired = vg_clampf( fabsf( s->state.slip ), 0.0f, 1.0f ); + float desired = 0.0f; + if( s->state.activity == k_skate_activity_ground ) + desired = vg_clampf( fabsf( s->state.slip ), 0.0f, 1.0f ); + s->blend_slide = vg_lerpf( s->blend_slide, desired, 2.4f*vg.time_delta); } @@ -2564,7 +2566,7 @@ VG_STATIC void player__skate_animate( player_instance *player, s->blend_z = vg_lerpf( s->blend_z, dirz, 2.4f*vg.time_delta ); s->blend_x = vg_lerpf( s->blend_x, dirx, 0.6f*vg.time_delta ); - s->blend_fly = vg_lerpf( s->blend_fly, fly, 2.4f*vg.time_delta ); + s->blend_fly = vg_lerpf( s->blend_fly, fly, 3.4f*vg.time_delta ); s->blend_weight= vg_lerpf( s->blend_weight, wdist, 9.0f*vg.time_delta ); } @@ -2631,7 +2633,12 @@ VG_STATIC void player__skate_animate( player_instance *player, mdl_keyframe air_pose[32]; { float target = -player->input_js1h->axis.value; + +#if 1 s->blend_airdir = vg_lerpf( s->blend_airdir, target, 2.4f*vg.time_delta ); +#else + s->blend_airdir = 0.0f; +#endif float air_frame = (s->blend_airdir*0.5f+0.5f) * (15.0f/30.0f); skeleton_sample_anim( sk, s->anim_air, air_frame, apose ); @@ -2667,16 +2674,41 @@ VG_STATIC void player__skate_animate( player_instance *player, av->id_ik_elbow_l, av->id_ik_elbow_r }; - for( int i=0; ipose[apply_to[i]-1].co[0] += offset[0]*add_grab_mod; dest->pose[apply_to[i]-1].co[2] += offset[2]*add_grab_mod; } - /* angle correction */ - if( v3_length2( s->state.up_dir ) > 0.001f ) - { + if( v3_length2( s->state.up_dir ) > 0.001f ){ + + if( v4_length(s->state.smoothed_rotation) <= 0.1f || + v4_length(s->state.smoothed_rotation) >= 1.1f ){ + vg_warn( "FIX THIS! CARROT\n" ); + v4_copy( player->rb.q, s->state.smoothed_rotation ); + } + v4_lerp( s->state.smoothed_rotation, player->rb.q, 2.0f*vg.frame_delta, + s->state.smoothed_rotation ); + q_normalize( s->state.smoothed_rotation ); + + v3f yaw_ref = {1.0f,0.0f,0.0f}, + yaw_smooth = {1.0f,0.0f,0.0f}; + q_mulv( player->rb.q, yaw_ref, yaw_ref ); + q_mulv( s->state.smoothed_rotation, yaw_smooth, yaw_smooth ); + m3x3_mulv( player->rb.to_local, yaw_smooth, yaw_smooth ); + m3x3_mulv( player->rb.to_local, yaw_ref, yaw_ref ); + + float yaw_counter_rotate = v3_dot(yaw_ref,yaw_smooth); + yaw_counter_rotate = vg_clampf(yaw_counter_rotate,-1.0f,1.0f); + yaw_counter_rotate = acosf( yaw_counter_rotate ); + yaw_counter_rotate *= 1.0f-s->blend_fly; + v3f ndir; m3x3_mulv( player->rb.to_local, s->state.up_dir, ndir ); v3_normalize( ndir ); @@ -2687,23 +2719,30 @@ VG_STATIC void player__skate_animate( player_instance *player, a = acosf( vg_clampf( a, -1.0f, 1.0f ) ); v3f axis; - v4f q; + v4f qfixup, qcounteryaw, qtotal; v3_cross( up, ndir, axis ); - q_axis_angle( q, axis, a ); + q_axis_angle( qfixup, axis, a ); + + q_axis_angle( qcounteryaw, (v3f){0.0f,1.0f,0.0f}, yaw_counter_rotate ); + q_mul( qcounteryaw, qfixup, qtotal ); + q_normalize( qtotal ); mdl_keyframe *kf_hip = &dest->pose[av->id_hip-1]; - - for( int i=0; isk.bones[av->id_hip].co, kf_hip->co, origin ); + + for( int i=0; ipose[apply_to[i]-1]; - v3f v0; - v3_sub( kf->co, kf_hip->co, v0 ); - q_mulv( q, v0, v0 ); - v3_add( v0, kf_hip->co, kf->co ); + v3f v0, co; + v3_add( kf->co, av->sk.bones[apply_to[i]].co, co ); + v3_sub( co, origin, v0 ); + q_mulv( qtotal, v0, v0 ); + v3_add( v0, origin, co ); + v3_sub( co, av->sk.bones[apply_to[i]].co, kf->co ); - q_mul( q, kf->q, kf->q ); + q_mul( qtotal, kf->q, kf->q ); q_normalize( kf->q ); } @@ -2722,7 +2761,7 @@ VG_STATIC void player__skate_animate( player_instance *player, *kf_foot_r = &dest->pose[av->id_ik_foot_r-1], *kf_knee_l = &dest->pose[av->id_ik_knee_l-1], *kf_knee_r = &dest->pose[av->id_ik_knee_r-1], - *kf_hip = &dest->pose[av->id_hip], + *kf_hip = &dest->pose[av->id_hip-1], *kf_wheels[] = { &dest->pose[av->id_wheel_r-1], &dest->pose[av->id_wheel_l-1] }; @@ -2748,15 +2787,22 @@ VG_STATIC void player__skate_animate( player_instance *player, v3f euler; v3_muls( s->state.trick_euler, VG_TAUf, euler ); + float jump_t = vg.time-s->state.jump_time; + + float k=10.0f; + float h = k*jump_t; + float extra = h*exp(1.0-h) * (s->state.jump_dir?1.0f:-1.0f); + q_axis_angle( qyaw, (v3f){0.0f,1.0f,0.0f}, euler[0] * 0.5f ); - q_axis_angle( qpitch, (v3f){1.0f,0.0f,0.0f}, euler[1] ); + q_axis_angle( qpitch, (v3f){1.0f,0.0f,0.0f}, euler[1] + extra ); q_axis_angle( qroll, (v3f){0.0f,0.0f,1.0f}, euler[2] ); - q_mul( qpitch, qroll, qtrick ); - q_mul( qyaw, qtrick, qtrick ); + q_mul( qyaw, qroll, qtrick ); + q_mul( qpitch, qtrick, qtrick ); q_mul( kf_board->q, qtrick, kf_board->q ); q_normalize( kf_board->q ); + /* foot weight distribution */ if( s->blend_weight > 0.0f ){ kf_foot_l->co[2] += s->blend_weight * 0.2f; @@ -2767,13 +2813,19 @@ VG_STATIC void player__skate_animate( player_instance *player, kf_foot_l->co[2] += s->blend_weight * 0.1f; } - kf_foot_l->co[1] += s->slap; - kf_foot_r->co[1] += s->slap; - kf_knee_l->co[1] += s->slap; - kf_knee_r->co[1] += s->slap; - kf_board->co[1] += s->slap; - kf_hip->co[1] += s->slap * 0.25f; - + kf_foot_l->co[1] += s->state.slap; + kf_foot_r->co[1] += s->state.slap; + kf_knee_l->co[1] += s->state.slap; + kf_knee_r->co[1] += s->state.slap; + kf_board->co[1] += s->state.slap; + kf_hip->co[1] += s->state.slap * 0.25f; + + /* + * animation wishlist: + * boardslide/grind jump animations + * when tricking the slap should not appply or less apply + * not animations however DONT target grinds that are vertically down. + */ /* truck rotation */ for( int i=0; i<2; i++ ) diff --git a/player_skate.h b/player_skate.h index ee1a236..1c23b58 100644 --- a/player_skate.h +++ b/player_skate.h @@ -59,7 +59,8 @@ struct player_skate v2f grab_mouse_delta; int charging_jump, jump_dir; - float jump_charge; + float jump_charge, + slap; double jump_time; double start_push, @@ -71,6 +72,8 @@ struct player_skate double air_start; v3f air_init_v, air_init_co; + + v4f smoothed_rotation; } state, state_gate_storage; @@ -96,8 +99,6 @@ struct player_skate blend_airdir, blend_weight; - float slap; - /* vectors representing the direction of the axels in localspace */ v3f truckv0[2]; v2f wobble; -- 2.25.1