-VG_STATIC void player_skate_reset( player_interface *player,
- player_attachment *at,
- struct respawn_point *rp )
-{
- struct player_device_skate *s = at->storage;
- v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
- s->state.follow_cam_gate = NULL;
+ q_axis_angle( player->rb.q, (v3f){0.0f,1.0f,0.0f},
+ atan2f( inf->dir[0], inf->dir[2] ) );
+ v3_copy( player->cam.pos, s->state.posl );
+
+ m3x3f temp;
+ euler_m3x3( player->cam.angles, temp );
+ v3_muls( temp[2], -1.0f, s->state.dirl );
+
+ rb_update_transform( &player->rb );
+ v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
+ v3_copy( player->rb.v, s->state.cog_v );
+ }
+ else if( ev == k_player_device_event_update )
+ {
+ player_skate_update( dev, player );
+ }
+ else if( ev == k_player_device_event_post_update )
+ {
+ for( int i=0; i<s->prediction_count; i++ )
+ {
+ struct land_prediction *p = &s->predictions[i];
+
+ for( int j=0; j<p->log_length - 1; j ++ )
+ vg_line( p->log[j], p->log[j+1], p->colour );
+
+ vg_line_cross( p->log[p->log_length-1], p->colour, 0.25f );
+
+ v3f p1;
+ v3_add( p->log[p->log_length-1], p->n, p1 );
+ vg_line( p->log[p->log_length-1], p1, 0xffffffff );
+
+ vg_line_pt3( p->apex, 0.02f, 0xffffffff );
+ }
+
+ vg_line_pt3( s->state.apex, 0.200f, 0xff0000ff );
+ vg_line_pt3( s->state.apex, 0.201f, 0xff00ffff );
+ }
+ else if( ev == k_player_device_event_animate )
+ {
+ player_skate_animate( dev, player );
+ }
+ else if( ev == k_player_device_event_post_animate )
+ {
+ player_skate_post_animate( dev, player );
+ }
+ else if( ev == k_player_device_event_debug_ui )
+ {
+ player_skate_ui( dev, player );
+ }
+ else
+ return 0;
+
+ return 1;