X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=93194f7493a8645d52b718f37a2db1dc616cbcad;hb=5086e369c10a9ae5d5d4fa271a99c731727dbcfa;hp=098ce8ad42d1fe26e1bc138e3b193b5318f53278;hpb=56f320d8ce6e8997370ec8e02fe50ca2d07b67f0;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index 098ce8a..93194f7 100644 --- a/player_skate.c +++ b/player_skate.c @@ -851,7 +851,7 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) 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; @@ -876,6 +876,12 @@ VG_STATIC void skate_apply_pump_model( player_instance *player ) { struct player_skate *s = &player->_skate; + if( s->state.activity != k_skate_activity_ground ) + { + v3_zero( s->state.throw_v ); + return; + } + /* Throw / collect routine * * TODO: Max speed boost @@ -1904,7 +1910,6 @@ VG_STATIC void player__skate_update( player_instance *player ) skate_apply_friction_model( player ); skate_weight_distribute( player ); - skate_apply_pump_model( player ); } else { @@ -1932,6 +1937,7 @@ grinding:; skate_apply_jump_model( player ); skate_apply_grab_model( player ); skate_apply_trick_model( player ); + skate_apply_pump_model( player ); begin_collision:; @@ -2219,11 +2225,12 @@ begin_collision:; } skate_integrate( player ); - vg_line_pt3( s->state.cog, 0.02f, VG__WHITE ); + vg_line_pt3( s->state.cog, 0.02f, VG__WHITE ); - teleport_gate *gate; - if( (gate = world_intersect_gates(world, player->rb.co, s->state.prev_pos)) ) + struct gate_hit hit; + if( world_intersect_gates(world, player->rb.co, s->state.prev_pos, &hit) ) { + teleport_gate *gate = hit.gate; m4x3_mulv( gate->transport, player->rb.co, player->rb.co ); m3x3_mulv( gate->transport, player->rb.v, player->rb.v ); m4x3_mulv( gate->transport, s->state.cog, s->state.cog ); @@ -2239,7 +2246,7 @@ begin_collision:; rb_update_transform( &player->rb ); s->state_gate_storage = s->state; - player__pass_gate( player, gate ); + player__pass_gate( player, &hit ); } } @@ -2576,24 +2583,18 @@ VG_STATIC void player__skate_animate( player_instance *player, v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co ); float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f ); -#if 0 - v4f qresy, qresx, qresidual; - m3x3f mtx_residual; - q_axis_angle( qresy, player->rb.to_world[1], s->state.steery_s*substep ); - q_axis_angle( qresx, player->rb.to_world[0], s->state.steerx_s*substep ); - - q_mul( qresy, qresx, qresidual ); - q_normalize( qresidual ); - q_mul( dest->root_q, qresidual, dest->root_q ); - q_normalize( dest->root_q ); -#endif v4f qflip; if( (s->state.activity == k_skate_activity_air) && (fabsf(s->state.flip_rate) > 0.01f) ) { - float t = s->state.flip_time + s->state.flip_rate*substep*k_rb_delta, - angle = vg_clampf( t, -1.0f, 1.0f ) * VG_TAUf, + float t = s->state.flip_time; + sign = vg_signf( t ); + + t = 1.0f - vg_minf( 1.0f, fabsf( t * 1.1f ) ); + t = sign * (1.0f-t*t); + + float angle = vg_clampf( t, -1.0f, 1.0f ) * VG_TAUf, distm = s->land_dist * fabsf(s->state.flip_rate) * 3.0f, blend = vg_clampf( 1.0f-distm, 0.0f, 1.0f );