longjump gates
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gate.h
index 1e8c26247a718ef270e27dc71951883ab871efd3..b6942519c4fe93059a9f881284dcd51db9a799d3 100644 (file)
@@ -81,30 +81,29 @@ VG_STATIC int render_gate( world_instance *world_inside,
    }
 
    /* update gate camera */
-   static camera gate_view;
-   gate_view.fov = cam->fov;
-   gate_view.nearz = 0.1f;
-   gate_view.farz  = 2000.0f;
+   gate_camera.fov = cam->fov;
+   gate_camera.nearz = 0.1f;
+   gate_camera.farz  = 2000.0f;
 
-   m4x3_mul( gate->transport, cam->transform, gate_view.transform );
-   camera_update_view( &gate_view );
-   camera_update_projection( &gate_view );
+   m4x3_mul( gate->transport, cam->transform, gate_camera.transform );
+   camera_update_view( &gate_camera );
+   camera_update_projection( &gate_camera );
 
    /* Add special clipping plane to projection */
    v4f surface;
    m3x3_mulv( gate->recv_to_world, (v3f){0.0f,0.0f,-1.0f}, surface );
    surface[3] = v3_dot( surface, gate->co[1] );
    
-   m4x3_mulp( gate_view.transform_inverse, surface, surface );
+   m4x3_mulp( gate_camera.transform_inverse, surface, surface );
    surface[3] = -fabsf(surface[3]);
 
    if( dist < -0.5f )
-      m4x4_clip_projection( gate_view.mtx.p, surface );
+      m4x4_clip_projection( gate_camera.mtx.p, surface );
 
    /* Ready to draw with new camrea */
-   camera_finalize( &gate_view );
+   camera_finalize( &gate_camera );
 
-   vg_line_pt3( gate_view.transform[3], 0.3f, 0xff00ff00 );
+   vg_line_pt3( gate_camera.transform[3], 0.3f, 0xff00ff00 );
    {
       m4x3f gate_xform;
       m4x3_copy( gate->to_world, gate_xform );
@@ -132,17 +131,17 @@ VG_STATIC int render_gate( world_instance *world_inside,
       glStencilMask( 0x00 ); 
    }
 
-   render_world( world_inside, &gate_view );
+   render_world( world_inside, &gate_camera );
 
    {
       glDisable( GL_STENCIL_TEST );
 
-      render_water_texture( world_inside, &gate_view );
+      render_water_texture( world_inside, &gate_camera );
       render_fb_bind( gpipeline.fb_main );
 
       glEnable( GL_STENCIL_TEST );
 
-      render_water_surface( world_inside, &gate_view );
+      render_water_surface( world_inside, &gate_camera );
 
       glStencilMask( 0xFF );
       glStencilFunc( GL_ALWAYS, 1, 0xFF );
@@ -211,11 +210,18 @@ VG_STATIC int gate_intersect( teleport_gate *gate, v3f pos, v3f last )
    return 0;
 }
 
+struct gate_hit
+{
+   struct nonlocal_gate *nonlocal;
+   struct route_gate    *route;
+   teleport_gate *gate;
+};
+
 /* 
  * Intersect all gates in the world
  */
-VG_STATIC teleport_gate *world_intersect_gates( world_instance *world,
-                                                v3f pos, v3f last )
+VG_STATIC int world_intersect_gates( world_instance *world,
+                                     v3f pos, v3f last, struct gate_hit *hit )
 {
    for( int i=0; i<world->gate_count; i++ )
    {
@@ -223,10 +229,29 @@ VG_STATIC teleport_gate *world_intersect_gates( world_instance *world,
       teleport_gate *gate = &rg->gate;
 
       if( gate_intersect( gate, pos, last ) )
-         return gate;
+      {
+         hit->gate = gate;
+         hit->nonlocal = NULL;
+         hit->route = rg;
+         return 1;
+      }
    }
 
-   return NULL;
+   for( int i=0; i<world->nonlocalgate_count; i++ )
+   {
+      struct nonlocal_gate *nlg = &world->nonlocal_gates[i];
+      teleport_gate *gate = &nlg->gate;
+
+      if( gate_intersect( gate, pos, last ) )
+      {
+         hit->gate = gate;
+         hit->nonlocal = nlg;
+         hit->route = NULL;
+         return 1;
+     }
+   }
+
+   return 0;
 }
 
 #endif /* WORLD_GATE_H */