mdl_close( mdl );
}
-static void player_glide_transition(void){
+static void player_glide_transition( bool reverse ){
localplayer.subsystem = k_player_subsystem_glide;
localplayer.have_glider = 0;
v3_copy( localplayer.rb.co, player_glide.rb.co );
- v4_copy( localplayer.rb.q, player_glide.rb.q );
+
+ if( reverse ){
+ v4f qyaw;
+ q_axis_angle( qyaw, (v3f){0,1,0}, VG_TAUf*0.5f );
+ q_mul( qyaw, localplayer.rb.q, player_glide.rb.q );
+ q_normalize( player_glide.rb.q );
+ }
+ else
+ v4_copy( localplayer.rb.q, player_glide.rb.q );
+
v3_copy( localplayer.rb.v, player_glide.rb.v );
v3_copy( localplayer.rb.w, player_glide.rb.w );
rb_update_matrices( &player_glide.rb );
static void player_glide_post_animate(void);
static void player_glide_im_gui(void);
static void player_glide_bind(void);
-static void player_glide_transition(void);
+static void player_glide_transition( bool reverse );
static bool glider_physics(void);
struct player_subsystem_interface static player_subsystem_glide = {
if( (state->activity <= k_skate_activity_air_to_grind) &&
localplayer.have_glider ){
- player_glide_transition();
+ player_glide_transition( state->reverse < 0.0f );
return;
}
if( vg_getkey( SDLK_8 ) ){
localplayer.have_glider = 1;
- localplayer.have_glider = 0;
+ localplayer.glider_orphan = 0;
}
vg_line_boxf_transformed( baller.rb.to_world, baller.box, VG__RED );