longjump gates
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index aae8280f5b30a006fe00172717bf01a7e8d8dce6..847f7f5bc6399335eb0f0f131bc3a4de67d7d9a1 100644 (file)
@@ -35,8 +35,10 @@ VG_STATIC int skate_collide_smooth( player_instance *player,
                                     m4x3f mtx, rb_sphere *sphere,
                                     rb_ct *man )
 {
+   world_instance *world = get_active_world();
+
    int len = 0;
-   len = rb_sphere__scene( mtx, sphere, NULL, &world.rb_geo.inf.scene, man );
+   len = rb_sphere__scene( mtx, sphere, NULL, &world->rb_geo.inf.scene, man );
 
    for( int i=0; i<len; i++ )
    {
@@ -70,6 +72,8 @@ VG_STATIC int skate_grind_scansq( player_instance *player,
                                   v3f pos, v3f dir, float r,
                                   struct grind_info *inf )
 {
+   world_instance *world = get_active_world();
+
    v4f plane;
    v3_copy( dir, plane );
    v3_normalize( plane );
@@ -100,17 +104,17 @@ VG_STATIC int skate_grind_scansq( player_instance *player,
    v3_cross( plane, player->basis[1], support_axis );
    v3_normalize( support_axis );
    
-   while( bh_next( world.geo_bh, &it, box, &idx ) )
+   while( bh_next( world->geo_bh, &it, box, &idx ) )
    {
-      u32 *ptri = &world.scene_geo->arrindices[ idx*3 ];
+      u32 *ptri = &world->scene_geo->arrindices[ idx*3 ];
       v3f tri[3];
 
-      struct world_material *mat = world_tri_index_material(ptri[0]);
+      struct world_material *mat = world_tri_index_material(world,ptri[0]);
       if( !(mat->info.flags & k_material_flag_skate_surface) )
          continue;
 
       for( int j=0; j<3; j++ )
-         v3_copy( world.scene_geo->arrvertices[ptri[j]].co, tri[j] );
+         v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
 
       for( int j=0; j<3; j++ )
       {
@@ -323,6 +327,8 @@ VG_STATIC int solve_prediction_for_target( player_instance *player,
 VG_STATIC 
 void player__approximate_best_trajectory( player_instance *player )
 {
+   world_instance *world = get_active_world();
+
    struct player_skate *s = &player->_skate;
    float k_trace_delta = k_rb_delta * 10.0f;
 
@@ -390,7 +396,7 @@ void player__approximate_best_trajectory( player_instance *player )
          if( !grind_located && (launch_vy - gravity*t < 0.0f) )
          {
             v3f closest;
-            if( bh_closest_point( world.geo_bh, co1, closest, 1.0f ) != -1 )
+            if( bh_closest_point( world->geo_bh, co1, closest, 1.0f ) != -1 )
             {
                v3f ve;
                v3_copy( launch_v, ve );
@@ -420,7 +426,7 @@ void player__approximate_best_trajectory( player_instance *player )
          float t1;
          v3f n;
 
-         int idx = spherecast_world( co0, co1, k_board_radius, &t1, n );
+         int idx = spherecast_world( world, co0, co1, k_board_radius, &t1, n );
          if( idx != -1 )
          {
             v3f co;
@@ -444,8 +450,9 @@ void player__approximate_best_trajectory( player_instance *player )
             p->score = -v3_dot( ve, p->n );
             p->land_dist = t + k_trace_delta * t1;
 
-            u32 vert_index = world.scene_geo->arrindices[ idx*3 ];
-            struct world_material *mat = world_tri_index_material( vert_index );
+            u32 vert_index = world->scene_geo->arrindices[ idx*3 ];
+            struct world_material *mat = 
+               world_tri_index_material( world, vert_index );
             
             /* Bias prediction towords ramps */
             if( !(mat->info.flags & k_material_flag_skate_surface) )
@@ -1080,6 +1087,7 @@ int skate_compute_surface_alignment( player_instance *player,
                                      v3f surface_normal, v3f axel_dir )
 {
    struct player_skate *s = &player->_skate;
+   world_instance *world = get_active_world();
 
    v3f truck, left, right;
    m4x3_mulv( player->rb.to_world, ra, truck );
@@ -1104,7 +1112,7 @@ int skate_compute_surface_alignment( player_instance *player,
       v3_muladds( left,  player->rb.to_world[1],  k_board_radius,   left );
       ray_l.dist = 2.1f * k_board_radius;
 
-      res_l = ray_world( left, dir, &ray_l );
+      res_l = ray_world( world, left, dir, &ray_l );
 
       if( res_l )
          break;
@@ -1117,7 +1125,7 @@ int skate_compute_surface_alignment( player_instance *player,
       v3_muladds( right, player->rb.to_world[1],  k_board_radius,   right );
       ray_r.dist = 2.1f * k_board_radius;
 
-      res_r = ray_world( right, dir, &ray_r );
+      res_r = ray_world( world, right, dir, &ray_r );
 
       if( res_r )
          break;
@@ -1155,15 +1163,15 @@ int skate_compute_surface_alignment( player_instance *player,
    {
       /* fallback: use the closes point to the trucks */
       v3f closest;
-      int idx = bh_closest_point( world.geo_bh, midpoint, closest, 0.1f );
+      int idx = bh_closest_point( world->geo_bh, midpoint, closest, 0.1f );
 
       if( idx != -1 )
       {
-         u32 *tri = &world.scene_geo->arrindices[ idx * 3 ];
+         u32 *tri = &world->scene_geo->arrindices[ idx * 3 ];
          v3f verts[3];
 
          for( int j=0; j<3; j++ )
-            v3_copy( world.scene_geo->arrvertices[ tri[j] ].co, verts[j] );
+            v3_copy( world->scene_geo->arrvertices[ tri[j] ].co, verts[j] );
 
          v3f vert0, vert1, n;
          v3_sub( verts[1], verts[0], vert0 );
@@ -1302,7 +1310,7 @@ VG_STATIC int skate_point_visible( v3f origin, v3f target )
    v3_muls( dir, 1.0f/ray.dist, dir );
    ray.dist -= 0.025f;
 
-   if( ray_world( origin, dir, &ray ) )
+   if( ray_world( get_active_world(), origin, dir, &ray ) )
       return 0;
 
    return 1;
@@ -1812,6 +1820,8 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player )
 VG_STATIC void player__skate_update( player_instance *player )
 {
    struct player_skate *s = &player->_skate;
+   world_instance *world = get_active_world();
+
    v3_copy( player->rb.co, s->state.prev_pos );
    s->state.activity_prev = s->state.activity;
 
@@ -1980,7 +1990,7 @@ begin_collision:;
       v3f n;
 
       float cast_radius = wheels[i].radius - k_penetration_slop * 2.0f;
-      if( spherecast_world( current, future, cast_radius, &t, n ) != -1)
+      if( spherecast_world( world, current, future, cast_radius, &t, n ) != -1)
          max_time = vg_minf( max_time, t * s->substep );
    }
 
@@ -2029,7 +2039,7 @@ begin_collision:;
    float t;
    v3f n;
    if( (v3_dist2( head_wp0, head_wp1 ) > 0.001f) &&
-       (spherecast_world( head_wp0, head_wp1, 0.2f, &t, n ) != -1) )
+       (spherecast_world( world, head_wp0, head_wp1, 0.2f, &t, n ) != -1) )
    {
       v3_lerp( start_co, player->rb.co, t, player->rb.co );
       rb_update_transform( &player->rb );
@@ -2075,7 +2085,7 @@ begin_collision:;
 
    rb_ct *cman = &manifold[manifold_len];
 
-   int l = rb_capsule__scene( mtx, &capsule, NULL, &world.rb_geo.inf.scene,
+   int l = rb_capsule__scene( mtx, &capsule, NULL, &world->rb_geo.inf.scene,
                               cman );
 
    /* weld joints */
@@ -2209,11 +2219,12 @@ begin_collision:;
    }
 
    skate_integrate( player );
-   vg_line_pt3( s->state.cog, 0.02f,  VG__WHITE );
+   vg_line_pt3( s->state.cog, 0.02f, VG__WHITE );
 
-   teleport_gate *gate;
-   if( (gate = world_intersect_gates( player->rb.co, s->state.prev_pos )) )
+   struct gate_hit hit;
+   if( world_intersect_gates(world, player->rb.co, s->state.prev_pos, &hit) )
    {
+      teleport_gate *gate = hit.gate;
       m4x3_mulv( gate->transport, player->rb.co, player->rb.co );
       m3x3_mulv( gate->transport, player->rb.v,  player->rb.v );
       m4x3_mulv( gate->transport, s->state.cog,   s->state.cog );
@@ -2229,7 +2240,7 @@ begin_collision:;
       rb_update_transform( &player->rb );
 
       s->state_gate_storage = s->state;
-      player__pass_gate( player, gate );
+      player__pass_gate( player, &hit );
    }
 }