update vg
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index bd83545df6d7f43a9ece7c7dc86f9810621a26db..c300b3f579a67c95a1b95663d00d5b89b461726d 100644 (file)
@@ -347,7 +347,7 @@ VG_STATIC int create_jumps_to_hit_target( player_instance *player,
 VG_STATIC 
 void player__approximate_best_trajectory( player_instance *player )
 {
-   world_instance *world = get_active_world();
+   world_instance *world0 = get_active_world();
 
    struct player_skate *s = &player->_skate;
    float k_trace_delta = k_rb_delta * 10.0f;
@@ -392,6 +392,7 @@ void player__approximate_best_trajectory( player_instance *player )
       v3_copy( player->rb.co, launch_co );
       v3_copy( player->rb.v,  launch_v );
       v3_copy( launch_co, co0 );
+      world_instance *trace_world = world0;
 
       float vt  = (float)m * (1.0f/30.0f),
             ang = vg_lerpf( angle_begin, angle_end, vt ) * 0.15f;
@@ -429,10 +430,9 @@ void player__approximate_best_trajectory( player_instance *player )
 
          /* REFACTOR */
 
-         v3f closest;
+         v3f closest={0.0f,0.0f,0.0f};
          if( search_for_grind ){
-            if( bh_closest_point( world->geo_bh, co1, closest, 1.0f ) != -1 ){
-
+            if( bh_closest_point(trace_world->geo_bh,co1,closest,1.0f) != -1 ){
                float min_dist = 0.75f;
                      min_dist *= min_dist;
 
@@ -491,14 +491,18 @@ void player__approximate_best_trajectory( player_instance *player )
             }
          }
 
-         if( world->rendering_gate ){
-            ent_gate *gate = world->rendering_gate;
+         if( trace_world->rendering_gate ){
+            ent_gate *gate = trace_world->rendering_gate;
             if( gate_intersect( gate, co1, co0 ) ){
                m4x3_mulv( gate->transport, co0, co0 );
                m4x3_mulv( gate->transport, co1, co1 );
                m3x3_mulv( gate->transport, launch_v, launch_v);
                m4x3_mulv( gate->transport, launch_co, launch_co );
                m3x3_mul( gate->transport, basis, basis );
+
+               if( gate->type == k_gate_type_nonlocel ){
+                  trace_world = &world_global.worlds[ gate->target ];
+               }
             }
          }
 
@@ -508,15 +512,16 @@ void player__approximate_best_trajectory( player_instance *player )
          float scan_radius = k_board_radius;
                scan_radius *= vg_clampf( t, 0.02f, 1.0f );
 
-         int idx = spherecast_world( world, co0, co1, scan_radius, &t1, n );
+         int idx = spherecast_world(trace_world, co0, co1, scan_radius, &t1, n);
          if( idx != -1 ){
             v3f co;
             v3_lerp( co0, co1, t1, co );
             v3_copy( co, inf->log[ inf->log_length ++ ] ); 
 
             v3_copy( n, inf->n );
-            u32 *tri = &world->scene_geo->arrindices[ idx*3 ];
-            struct world_surface *surf = world_tri_index_surface(world, tri[0]);
+            u32 *tri = &trace_world->scene_geo->arrindices[ idx*3 ];
+            struct world_surface *surf = 
+               world_tri_index_surface( trace_world, tri[0] );
 
             inf->type = k_prediction_land;
 
@@ -591,7 +596,7 @@ void player__approximate_best_trajectory( player_instance *player )
             float t1;
             v3f n;
 
-            int idx = spherecast_world( world, co0,co1,
+            int idx = spherecast_world( world0, co0,co1,
                                         k_board_radius*0.1f, &t1, n);
             if( idx != -1 ){
                goto invalidated_grind;
@@ -1187,7 +1192,7 @@ VG_STATIC void player__skate_post_update( player_instance *player )
    }
 
    static float menu_gate = 1.0f;
-   menu_gate = vg_lerpf( menu_gate, 1-cl_menu, vg.frame_delta*4.0f );
+   menu_gate = vg_lerpf( menu_gate, 1-cl_menu, vg.time_frame_delta*4.0f );
 
    float
          vol_main    = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ) * menu_gate,
@@ -1225,7 +1230,7 @@ VG_STATIC void player__skate_post_update( player_instance *player )
                           vg_lerpf( 250.0f, 80.0f, attn ) );
 
    if( s->sample_change_cooldown > 0.0f ){
-      s->sample_change_cooldown -= vg.frame_delta;
+      s->sample_change_cooldown -= vg.time_frame_delta;
    }
    else{
       int sample_type = k_skate_sample_concrete;
@@ -2388,7 +2393,8 @@ begin_collision:;
 
    manifold_len += l;
 
-   debug_capsule( mtx, capsule.radius, capsule.height, VG__WHITE );
+   if( vg_lines.draw )
+      debug_capsule( mtx, capsule.radius, capsule.height, VG__WHITE );
 
    /* add limits */
    if( s->state.activity >= k_skate_activity_grind_any ){
@@ -2734,11 +2740,10 @@ VG_STATIC void player__skate_animate( player_instance *player,
                                (vg.time - s->state.cur_push) < 0.125,
                                6.0f*vg.time_delta );
 
-      float pt = push_time + vg.accumulator;
       if( s->state.reverse > 0.0f )
-         skeleton_sample_anim( sk, s->anim_push, pt, bpose );
+         skeleton_sample_anim( sk, s->anim_push, push_time, bpose );
       else
-         skeleton_sample_anim( sk, s->anim_push_reverse, pt, bpose );
+         skeleton_sample_anim( sk, s->anim_push_reverse, push_time, bpose );
 
       skeleton_lerp_pose( sk, apose, bpose, s->blend_push, apose );
 
@@ -2856,7 +2861,8 @@ VG_STATIC void player__skate_animate( player_instance *player,
             vg_warn( "FIX THIS! CARROT\n" );
             v4_copy( player->rb.q, s->state.smoothed_rotation );
          }
-         v4_lerp( s->state.smoothed_rotation, player->rb.q, 2.0f*vg.frame_delta,
+         v4_lerp( s->state.smoothed_rotation, player->rb.q, 
+                  2.0f*vg.time_frame_delta,
                   s->state.smoothed_rotation );
          q_normalize( s->state.smoothed_rotation );
 
@@ -3025,13 +3031,13 @@ VG_STATIC void player__skate_animate( player_instance *player,
    rb_extrapolate( &player->rb, dest->root_co, dest->root_q );
    v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co );
 
-   float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f );
+   float substep = vg.time_fixed_extrapolate;
 
    v4f qflip;
    if( (s->state.activity <= k_skate_activity_air_to_grind) &&
        (fabsf(s->state.flip_rate) > 0.01f) )
    {
-      float t     = s->state.flip_time;
+      float t     = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta;
             sign  = vg_signf( t );
 
       t  = 1.0f - vg_minf( 1.0f, fabsf( t * 1.1f ) );