automatic camera inversing across portals
[carveJwlIkooP6JGAAIwe30JlM.git] / player_device_skate.h
index 04a2da1115242581249cece7b445d8d03d23c553..13f6398a0b549d37f338b2b25ffd0bacb7062320 100644 (file)
@@ -44,9 +44,11 @@ struct player_device_skate
       double start_push,
              cur_push;
 
-      struct mixedcam_state cam;
-
       v3f prev_pos;
+
+
+      v3f vl,       /* 1st */
+          posl;    /* 3rd */
    }
    state,
    state_gate_storage;
@@ -1126,9 +1128,35 @@ VG_STATIC void player_skate_update( player_interface *player,
                                      &s->sphere_front, manifold ),
    len_back = skate_collide_smooth( player, mtx_back,  
                                     &s->sphere_back, &manifold[len_front] ),
-
    interface_len = len_front + len_back;
 
+   /* try to slap both wheels onto the ground when landing to prevent mega 
+    * angular velocities being added */
+   if( (s->state.activity == k_skate_activity_air) && (len_front != len_back) )
+   {
+      v3f trace_from, trace_dir;
+      v3_muls( player->rb.to_world[1], -1.0f, trace_dir );
+
+      if( len_front )
+         v3_copy( mtx_back[3],  trace_from );
+      else
+         v3_copy( mtx_front[3], trace_from );
+
+      ray_hit ray;
+      ray.dist = 0.6f;
+
+      if( ray_world( trace_from, trace_dir, &ray ) )
+      {
+         rb_ct *ct = &manifold[ interface_len ];
+
+         v3_copy( ray.pos, ct->co );
+         v3_copy( ray.normal, ct->n );
+         ct->p = 0.0f;
+
+         interface_len ++;
+      }
+   }
+
    interface_manifold = manifold;
    grind_manifold = manifold + interface_len;
 
@@ -1171,8 +1199,12 @@ VG_STATIC void player_skate_update( player_interface *player,
       m4x3_mulv( gate->transport, s->state.cog,   s->state.cog );
       m3x3_mulv( gate->transport, s->state.cog_v, s->state.cog_v );
       m3x3_mulv( gate->transport, s->state.throw_v, s->state.throw_v );
+      m4x3_mulv( gate->transport, s->state.posl, s->state.posl );
+      m3x3_mulv( gate->transport, s->state.vl, s->state.vl );
 
+#if 0
       mixedcam_transport( &s->state.cam, gate );
+#endif
 
       v4f transport_rotation;
       m3x3_q( gate->transport, transport_rotation );
@@ -1506,40 +1538,34 @@ VG_STATIC void skate_camera_firstperson( player_interface *player,
    //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.cam.vl, look_dir, 4.0f*vg.time_delta, s->state.cam.vl );
+   v3_lerp( s->state.vl, look_dir, 4.0f*vg.time_delta, s->state.vl );
 
-   skate_camera_vector_look( &at->cam_1st, s->state.cam.vl, 0.7f, 0.5f );
+   skate_camera_vector_look( &at->cam_1st, s->state.vl, 1.0f, 0.25f );
 }
 
-#if 0
 VG_STATIC void skate_camera_thirdperson( player_interface *player,
-                                         struct player_device_skate *s,
-                                         struct player_avatar *av, camera *cam )
+                                         player_attachment *at )
 {
-   v3f prev_pos, cam_look_dir, d;
+   struct player_device_skate *s = at->storage;
+   struct player_avatar *av = player->playeravatar;
 
-   v3_copy( s->state.cam.pos, prev_pos );
-   skate_camera_thirdperson_nextpos( player, s, av, s->state.cam.pos, d);
+   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 );
 
-   if( s->state.cam.gate )
-   {
-      v2f _;
-      if( gate_intersect_plane( s->state.cam.gate, 
-                                s->state.cam.pos, prev_pos, _ ) )
-      {
-         m4x3_mulv( s->state.cam.gate->transport, 
-                        s->state.cam.pos, s->state.cam.pos );
-         m3x3_mulv( s->state.cam.gate->transport, d, d );
-         player_apply_transport_to_cam( s->state.cam.gate->transport );
+   v3_muladds( origin, dir, -2.0f, target );
+   v3_lerp( s->state.posl, target, vg.frame_delta * 12.0f, s->state.posl );
 
-         s->state.cam.gate = NULL;
-      }
-   }
-   
-   skate_camera_vector_look( cam, d, 1.0f, 0.0f );
-   v3_copy( s->state.cam.pos, cam->pos );
+   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;
 }
-#endif
 
 VG_STATIC void player_skate_post_animate( player_interface *player,
                                           player_attachment *at )
@@ -1551,11 +1577,7 @@ VG_STATIC void player_skate_post_animate( player_interface *player,
    v3_zero( at->cam_1st.angles );
    at->cam_1st.fov = 90.0f;
 
-#if 0
-   if( cl_thirdperson )
-      skate_camera_thirdperson( player, s, av, cam );
-   else
-#endif
+   skate_camera_thirdperson( player, at );
    skate_camera_firstperson( player, at );
 
    /* FIXME: Organize this. Its int wrong fucking place */
@@ -1579,7 +1601,9 @@ VG_STATIC void player_skate_reset( player_interface *player,
    struct player_device_skate *s = at->storage;
    v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
 
+#if 0
    mixedcam_reset( player, &s->state.cam );
+#endif
 }
 
 VG_STATIC player_device player_device_skate =