+/* this is a little yucky but needs to be done so we can use this 'prediction'
+ * in the pose function. its unfortunate. too bad
+ */
+VG_STATIC void skate_camera_thirdperson_nextpos( player_interface *player,
+ struct player_device_skate *s,
+ struct player_avatar *av,
+ v3f next_pos, v3f d )
+{
+ v3f origin, target;
+
+ if( s->state.follow_cam_gate )
+ {
+ m4x3f inverse;
+ m4x3_invert_affine( s->state.follow_cam_gate->transport, inverse );
+ m4x3_mulv( inverse, player->rb.co, origin );
+ }
+ else
+ {
+ v3_copy( player->rb.co, origin );
+ }
+
+ v3_add( origin, (v3f){0.0f,1.35f,0.0f}, origin );
+ v3_sub( origin, s->state.follow_cam_pos, d );
+
+ if( v3_length2( d ) < 0.1f*0.1f )
+ v3_copy( (v3f){ 0.0f, 0.0f, 1.0f }, d );
+ else
+ v3_normalize( d );
+
+ v3_muladds( origin, d, -2.0f, target );
+ v3_lerp( s->state.follow_cam_pos, target, vg.frame_delta * 12.0f, next_pos );
+}
+
+VG_STATIC void skate_camera_thirdperson( player_interface *player,
+ struct player_device_skate *s,
+ struct player_avatar *av, camera *cam )
+{
+ v3f prev_pos, cam_look_dir, d;
+
+ v3_copy( s->state.follow_cam_pos, prev_pos );
+ skate_camera_thirdperson_nextpos( player, s, av, s->state.follow_cam_pos, d);
+
+ if( s->state.follow_cam_gate )
+ {
+ v2f _;
+ if( gate_intersect_plane( s->state.follow_cam_gate,
+ s->state.follow_cam_pos, prev_pos, _ ) )
+ {
+ m4x3_mulv( s->state.follow_cam_gate->transport,
+ s->state.follow_cam_pos, s->state.follow_cam_pos );
+ m3x3_mulv( s->state.follow_cam_gate->transport, d, d );
+ player_apply_transport_to_cam( s->state.follow_cam_gate->transport );
+
+ s->state.follow_cam_gate = NULL;
+ }
+ }
+
+ skate_camera_vector_look( cam, d, 1.0f, 0.0f );
+ v3_copy( s->state.follow_cam_pos, cam->pos );
+}
+
+VG_STATIC void player_skate_get_camera( player_interface *player,
+ player_attachment *at, camera *cam )
+{
+ struct player_device_skate *s = at->storage;
+ struct player_avatar *av = player->playeravatar;
+
+ if( cl_thirdperson )
+ skate_camera_thirdperson( player, s, av, cam );
+ else
+ skate_camera_firstperson( player, s, av, cam );