X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=a796b7c67ee721c2ecfdb528f4bddf78691480f3;hb=67928190c66b05bd48b6b515278e930974d25cd2;hp=2c38f7e1028ca2a056c9be671edf6fbebd8a9eba;hpb=fdb2376a03749b901ff83f28be54b6dd6caf4b72;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index 2c38f7e..a796b7c 100644 --- a/player_skate.c +++ b/player_skate.c @@ -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; } } } @@ -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] );