v3_copy( sj->normal3, n1 );
v3_cross( n0, n1, dir );
- if( v3_length2( dir ) <= 0.001f )
+ if( v3_length2( dir ) <= 0.000001f )
continue;
v3_normalize( dir );
static void skate_grind_truck_apply( float sign, struct grind_info *inf,
float strength ){
struct player_skate_state *state = &player_skate.state;
-
/* REFACTOR */
v3f ra = { 0.0f, -k_board_radius, sign * k_board_length };
v3f raw, wsp;
}
/* yes, we are currently rebuilding mass matrices every frame. too bad! */
- v3f extent = { k_board_width, 0.1f, k_board_length };
+ v3f extent = { k_board_width*10.0f, 0.1f, k_board_length };
float ex2 = k_board_interia*extent[0]*extent[0],
ey2 = k_board_interia*extent[1]*extent[1],
ez2 = k_board_interia*extent[2]*extent[2];
} else if( stick_frames == 0 ){
/* TODO: EXIT SOUNDS */
}
+
+ if( (state->activity_prev < k_skate_activity_grind_any) &&
+ (state->activity >= k_skate_activity_grind_any) ){
+ state->velocity_limit = v3_length( localplayer.rb.v )*1.0f;
+ state->grind_y_start = localplayer.rb.co[1];
+ }
+
+ if( state->activity >= k_skate_activity_grind_any ){
+ f32 dy = localplayer.rb.co[1] - state->grind_y_start;
+ if( dy < 0.0f ){
+ state->velocity_limit += -dy*0.2f;
+ }
+ state->grind_y_start = localplayer.rb.co[1];
+
+
+ f32 speed_end = v3_length( localplayer.rb.v );
+ if( speed_end > state->velocity_limit ){
+ v3_muls( localplayer.rb.v, state->velocity_limit/speed_end,
+ localplayer.rb.v );
+ }
+ }
}
static void player__skate_im_gui(void){