spherecast predictions
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index cb36975a266bec614e2ccd53b99b7f377f3f53cd..8e4ae82b99d0ff547c8aa61d874359d395e9b7e9 100644 (file)
--- a/player.h
+++ b/player.h
@@ -69,7 +69,7 @@ VG_STATIC struct gplayer
 
       /* Utility */
       float vswitch, slip, slip_last, reverse;
-      float grab, jump, pushing, push_time;
+      float grab, jump, pushing, push_time, rise;
       v2f grab_mouse_delta;
 
       int lift_frames;
@@ -88,16 +88,25 @@ VG_STATIC struct gplayer
    int is_dead, death_tick_allowance, rewinding;
    int rewind_sound_wait;
 
-   v3f land_target;
-
-   struct land_log
+   struct land_prediction
    {
-      v3f positions[50];
-      u32 colour;
-      int count;
-   } 
-   land_log[22];
-   int land_log_count;
+      v3f   log[50];
+      v3f   n;
+      u32   log_length;
+      float score;
+
+      enum prediction_type
+      {
+         k_prediction_none,
+         k_prediction_land,
+         k_prediction_grind
+      }
+      type;
+
+      u32   colour;
+   }
+   predictions[22];
+   u32 prediction_count;
 
    v3f handl_target, handr_target,
        handl, handr;
@@ -232,7 +241,7 @@ VG_STATIC void player_mouseview(void);
  * -----------------------------------------------------------------------------
  */
 
-VG_STATIC void player_init(void)                                            /* 1 */
+VG_STATIC void player_init(void)                                         /* 1 */
 {
    player.input_js1h = vg_create_named_input( "steer-h", k_input_type_axis );
    player.input_js1v = vg_create_named_input( "steer-v", k_input_type_axis );
@@ -436,6 +445,34 @@ VG_STATIC void player_update_pre(void)
 {
    struct player_phys *phys = &player.phys;
 
+
+   {
+      v3f ra, rb, rx;
+      v3_copy( main_camera.pos, ra );
+      v3_muladds( ra, main_camera.transform[2], -10.0f, rb );
+
+      float t;
+      if( spherecast_world( ra, rb, 0.4f, &t, rx ) != -1 )
+      {
+         m4x3f mtx;
+         m3x3_identity( mtx );
+         v3_lerp( ra, rb, t, mtx[3] );
+
+         debug_sphere( mtx, 0.4f, 0xff00ff00 );
+
+         v3f x1;
+         v3_muladds( mtx[3], rx, 0.4f, x1 );
+         vg_line( mtx[3], x1, 0xffffffff );
+      }
+   }
+
+
+
+
+
+
+
+
    if( player.rewinding )
       return;
 
@@ -551,14 +588,18 @@ VG_STATIC void player_update_fixed(void)                                 /* 2 */
 
 VG_STATIC void player_update_post(void)
 {
-   for( int i=0; i<player.land_log_count; i++ )
+   for( int i=0; i<player.prediction_count; i++ )
    {
-      struct land_log *log = &player.land_log[i];
+      struct land_prediction *p = &player.predictions[i];
       
-      for( int j=0; j<log->count - 1; j ++ )
-         vg_line( log->positions[j], log->positions[j+1], log->colour );
+      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 );
 
-      vg_line_cross( log->positions[log->count-1], log->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 );
    }
 
    if( player.is_dead )