+VG_STATIC void skate_camera_firstperson( player_interface *player,
+ player_attachment *at )
+{
+ struct player_device_skate *s = at->storage;
+ struct player_avatar *av = player->playeravatar;
+
+ /* FIXME: viewpoint entity */
+ v3f vp = {-0.1f,1.8f,0.0f};
+ m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, at->cam_1st.pos );
+
+ v3_zero( at->cam_1st.angles );
+ at->cam_1st.fov = 119.0f;
+
+ v3f flat_dir,
+ vel_dir,
+ look_dir;
+
+ v3_copy( player->rb.v, vel_dir );
+ //v3_normalize( vel_dir );
+
+ float tti = s->land_dist;
+ v3f norm;
+ v3_copy( s->land_normal, norm );
+
+ if( s->state.activity == k_skate_activity_ground )
+ {
+ tti = 0.0f;
+ v3_copy( player->rb.to_world[1], norm );
+ }
+
+ v3_muladds( vel_dir, norm, -v3_dot(vel_dir,norm), flat_dir );
+ //v3_normalize( flat_dir );
+
+ v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir );
+ v3_lerp( s->state.vl, look_dir, 4.0f*vg.time_delta, s->state.vl );
+
+ skate_camera_vector_look( &at->cam_1st, s->state.vl, 1.0f, 0.25f );
+}
+
+VG_STATIC void skate_camera_thirdperson( player_interface *player,
+ player_attachment *at )
+{
+ struct player_device_skate *s = at->storage;
+ struct player_avatar *av = player->playeravatar;
+
+ v3f origin, dir, target;
+ v3_copy( player->rb.co, origin );
+ v3_add( origin, (v3f){0.0f,1.35f,0.0f}, origin );
+ v3_sub( origin, s->state.posl, dir );
+
+ if( v3_length2( dir ) < 0.1f*0.1f )
+ v3_copy( (v3f){ 0.0f, 0.0f, 1.0f }, dir ); /* FIXME */
+ else
+ v3_normalize( dir );
+
+ v3_muladds( origin, dir, -2.0f, target );
+ v3_lerp( s->state.posl, target, vg.frame_delta * 12.0f, s->state.posl );
+
+ v3_copy( s->state.posl, at->cam_3rd.pos );
+ skate_camera_vector_look( &at->cam_3rd, dir, 1.0f, 0.0f );
+ at->cam_3rd.fov = 100.0f;
+}
+
+VG_STATIC void player_skate_post_animate( player_interface *player,
+ player_attachment *at )
+{
+ struct player_device_skate *s = at->storage;
+ struct player_avatar *av = player->playeravatar;
+
+ v3_zero( at->cam_1st.pos );
+ v3_zero( at->cam_1st.angles );
+ at->cam_1st.fov = 90.0f;
+
+ skate_camera_thirdperson( player, at );
+ skate_camera_firstperson( player, at );
+
+ /* FIXME: Organize this. Its int wrong fucking place */
+ v3f vp0 = {0.0f,0.1f, 0.6f},
+ vp1 = {0.0f,0.1f,-0.6f};
+
+ m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp0, TEMP_BOARD_0 );
+ m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp1, TEMP_BOARD_1 );
+}
+