nonlocal stuff again
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index bec54539ecd625135513fd136df79ad731a8f117..e9a4f09f4b01cbaca4857b4b0e95c897f82218c4 100644 (file)
@@ -4,6 +4,7 @@
 #include "player.h"
 #include "audio.h"
 #include "vg/vg_perlin.h"
+#include "menu.h"
 
 VG_STATIC void player__skate_bind( player_instance *player )
 {
@@ -127,10 +128,8 @@ VG_STATIC int skate_grind_scansq( player_instance *player,
       v3f tri[3];
 
       struct world_surface *surf = world_tri_index_surface(world,ptri[0]);
-#if 0
       if( !(surf->info.flags & k_material_flag_skate_surface) )
          continue;
-#endif
 
       for( int j=0; j<3; j++ )
          v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
@@ -348,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;
@@ -393,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;
@@ -430,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;
 
@@ -492,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 ];
+               }
             }
          }
 
@@ -509,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;
 
@@ -579,8 +583,6 @@ void player__approximate_best_trajectory( player_instance *player )
          v3_add( launch_co, co0, co0 );
 
          /* rough scan to make sure we dont collide with anything */
-         /* NOTE this was rarely needed and ends up with false negatives. */
-#if 0
          for( int j=1; j<=16; j++ ){
             t  = (float)j*(1.0f/16.0f);
             t *= 0.9f;
@@ -594,15 +596,14 @@ void player__approximate_best_trajectory( player_instance *player )
             float t1;
             v3f n;
 
-            int idx = spherecast_world( world, co0,co1,
-                                        k_board_radius*0.5f, &t1, n);
+            int idx = spherecast_world( world0, co0,co1,
+                                        k_board_radius*0.1f, &t1, n);
             if( idx != -1 ){
                goto invalidated_grind;
             }
 
             v3_copy( co1, co0 );
          }
-#endif
 
          v3_copy( grind.n, jump->n );
 
@@ -614,10 +615,8 @@ void player__approximate_best_trajectory( player_instance *player )
 
          s->possible_jumps[ s->possible_jump_count ++ ] = *jump;
 
-#if 0
          continue;
 invalidated_grind:;
-#endif
       }
    }
 
@@ -1010,7 +1009,8 @@ VG_STATIC void skate_apply_pump_model( player_instance *player )
       v3_muladds( s->state.throw_v, player->rb.to_world[1], -doty, Fl);
 
       if( s->state.activity == k_skate_activity_ground ){
-         v3_muladds( player->rb.v,     Fl,  k_mmcollect_lat, player->rb.v );
+         if( v3_length2(player->rb.v)<(20.0f*20.0f) )
+            v3_muladds( player->rb.v,     Fl,  k_mmcollect_lat, player->rb.v );
          v3_muladds( s->state.throw_v, Fl, -k_mmcollect_lat, s->state.throw_v );
       }
 
@@ -1191,10 +1191,13 @@ VG_STATIC void player__skate_post_update( player_instance *player )
       slide = 0.0f;
    }
 
+   static float menu_gate = 1.0f;
+   menu_gate = vg_lerpf( menu_gate, 1-cl_menu, vg.frame_delta*4.0f );
+
    float
-         vol_main    = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ),
-         vol_air     = sqrtf(       air *attn * 0.5f ),
-         vol_slide   = sqrtf( (1.0f-air)*attn*slide * 0.25f );
+         vol_main    = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ) * menu_gate,
+         vol_air     = sqrtf(       air *attn * 0.5f )              * menu_gate,
+         vol_slide   = sqrtf( (1.0f-air)*attn*slide * 0.25f )       * menu_gate;
 
    const u32 flags = AUDIO_FLAG_SPACIAL_3D|AUDIO_FLAG_LOOP;
 
@@ -2390,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 ){
@@ -3033,7 +3037,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
    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 ) );