Fix major overstep with last commit
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.h
index 141cbc0fc9470602684c7c292c50b64e821fca3d..7920588e27e9672717669b890f7557d343d13b9a 100644 (file)
@@ -726,146 +726,145 @@ static void world_id_fixup( u32 *uid, mdl_header *mdl )
       *uid = 0xffffffff;
 }
 
-/* 
- * Create the strips of colour that run through the world along course paths
- */
-static int world_routes_gen_meshes(void)
+static void world_routes_create_mesh( u32 route_id )
 {
-   vg_info( "Generating route meshes\n" );
-
    struct subworld_routes *r = &world.routes;
-   scene_init( &r->scene_lines );
+   struct route *route = &r->routes[ route_id ];
 
-   for( int i=0; i<r->route_count; i++ )
-   {
-      struct route *route = &r->routes[i];
+   u32 stack[64];
+   u32 si = world_routes_get_path( route->start, stack );
 
-      u32 stack[64];
-      u32 si = world_routes_get_path( route->start, stack );
+   u32 last_valid = 0;
 
-      u32 last_valid = 0;
+   for( int sj=0; sj<si; sj++ )
+   {
+      int sk=(sj+1)%si;
 
-      for( int sj=0; sj<si; sj++ )
+      struct route_node *rnj = &r->nodes[ stack[sj] ],
+                        *rnk = &r->nodes[ stack[sk] ],
+                        *rnl;
+      
+      if( rnj->special_type && rnk->special_type )
       {
-         int sk=(sj+1)%si;
-
-         struct route_node *rnj = &r->nodes[ stack[sj] ],
-                           *rnk = &r->nodes[ stack[sk] ],
-                           *rnl;
-         
-         if( rnj->special_type && rnk->special_type )
-         {
-            last_valid = 0;
-            continue;
-         }
+         last_valid = 0;
+         continue;
+      }
 
-         float base_x0 = (float)rnj->ref_count*-0.5f + (float)rnj->current_refs,
-               base_x1 = (float)rnk->ref_count*-0.5f + (float)rnk->current_refs;
+      float base_x0 = (float)rnj->ref_count*-0.5f + (float)rnj->current_refs,
+            base_x1 = (float)rnk->ref_count*-0.5f + (float)rnk->current_refs;
 
-         if( rnk->special_type )
-         {
-            rnl = &r->nodes[ rnk->next[0] ];
-            base_x1 = (float)rnl->ref_count*-0.5f + (float)rnl->current_refs;
-         }
+      if( rnk->special_type )
+      {
+         rnl = &r->nodes[ rnk->next[0] ];
+         base_x1 = (float)rnl->ref_count*-0.5f + (float)rnl->current_refs;
+      }
 
-         if( sk == 0 )
-         {
-            base_x1 -= 1.0f;
-         }
+      if( sk == 0 )
+      {
+         base_x1 -= 1.0f;
+      }
 
-         v3f p0, h0, p1, h1, p, pd;
-         
-         v3_copy( rnj->co, p0 );
-         v3_muladds( rnj->co, rnj->h,  1.0f, h0 );
-         v3_copy( rnk->co, p1 );
-         v3_muladds( rnk->co, rnk->h, -1.0f, h1 );
+      v3f p0, h0, p1, h1, p, pd;
+      
+      v3_copy( rnj->co, p0 );
+      v3_muladds( rnj->co, rnj->h,  1.0f, h0 );
+      v3_copy( rnk->co, p1 );
+      v3_muladds( rnk->co, rnk->h, -1.0f, h1 );
 
-         float t=0.0f;
-         int it = 0;
+      float t=0.0f;
+      int it = 0;
 
-         for( int it=0; it<256; it ++ )
-         {
-            float const k_sample_dist = 0.02f;
-            eval_bezier_time( p0,p1,h0,h1, t,p );
-            eval_bezier_time( p0,p1,h0,h1, t+k_sample_dist,pd );
+      for( int it=0; it<256; it ++ )
+      {
+         float const k_sample_dist = 0.02f;
+         eval_bezier_time( p0,p1,h0,h1, t,p );
+         eval_bezier_time( p0,p1,h0,h1, t+k_sample_dist,pd );
 
-            float mod = k_sample_dist / v3_dist( p, pd );
+         float mod = k_sample_dist / v3_dist( p, pd );
 
-            v3f v0,up, right;
-            v3_muls( rnj->up, 1.0f-t, up );
-            v3_muladds( up, rnk->up, t, up );
+         v3f v0,up, right;
+         v3_muls( rnj->up, 1.0f-t, up );
+         v3_muladds( up, rnk->up, t, up );
 
-            v3_sub( pd,p,v0 );
-            v3_cross( up, v0, right );
-            v3_normalize( right );
+         v3_sub( pd,p,v0 );
+         v3_cross( up, v0, right );
+         v3_normalize( right );
 
-            float cur_x = (1.0f-t)*base_x0 + t*base_x1;
-            
-            v3f sc, sa, sb, down;
-            v3_muladds( p, right, cur_x, sc );
-            v3_muladds( sc, up, 1.5f, sc );
-            v3_muladds( sc, right,  0.45f, sa );
-            v3_muladds( sc, right, -0.45f, sb );
-            v3_muls( up, -1.0f, down );
+         float cur_x = (1.0f-t)*base_x0 + t*base_x1;
+         
+         v3f sc, sa, sb, down;
+         v3_muladds( p, right, cur_x, sc );
+         v3_muladds( sc, up, 1.5f, sc );
+         v3_muladds( sc, right,  0.45f, sa );
+         v3_muladds( sc, right, -0.45f, sb );
+         v3_muls( up, -1.0f, down );
+         
+         ray_hit ha, hb;
+         ha.dist = 8.0f;
+         hb.dist = 8.0f;
+         if( ray_world( sa, down, &ha ) && 
+             ray_world( sb, down, &hb ))
+         {
+            mdl_vert va, vb;
             
-            ray_hit ha, hb;
-            ha.dist = 8.0f;
-            hb.dist = 8.0f;
-            if(ray_world( sa, down, &ha ) && 
-               ray_world( sb, down, &hb ))
-            {
-               mdl_vert va, vb;
-               
-               v3_muladds( ha.pos, up, 0.06f, va.co );
-               v3_muladds( hb.pos, up, 0.06f, vb.co );
-               v3_copy( up, va.norm );
-               v3_copy( up, vb.norm );
-               v2_zero( va.uv );
-               v2_zero( vb.uv );
-
-               scene_push_vert( &r->scene_lines, &va );
-               scene_push_vert( &r->scene_lines, &vb );
-
-               if( last_valid )
-               {
-                  /* Connect them with triangles */
-                  scene_push_tri( &r->scene_lines, (u32[3]){ 
-                        last_valid+0-2, last_valid+1-2, last_valid+2-2} );
-                  scene_push_tri( &r->scene_lines, (u32[3]){ 
-                        last_valid+1-2, last_valid+3-2, last_valid+2-2} );
-               }
-               
-               last_valid = r->scene_lines.vertex_count;
-            }
-            else
-               last_valid = 0;
+            v3_muladds( ha.pos, up, 0.06f, va.co );
+            v3_muladds( hb.pos, up, 0.06f, vb.co );
+            v3_copy( up, va.norm );
+            v3_copy( up, vb.norm );
+            v2_zero( va.uv );
+            v2_zero( vb.uv );
 
-            t += 1.0f*mod;
+            scene_push_vert( &r->scene_lines, &va );
+            scene_push_vert( &r->scene_lines, &vb );
 
-            if( t >= 1.0f )
+            if( last_valid )
             {
-               /* TODO special case for end of loop, need to add triangles
-                *      between first and last rungs */
-               break;
+               /* Connect them with triangles */
+               scene_push_tri( &r->scene_lines, (u32[3]){ 
+                     last_valid+0-2, last_valid+1-2, last_valid+2-2} );
+               scene_push_tri( &r->scene_lines, (u32[3]){ 
+                     last_valid+1-2, last_valid+3-2, last_valid+2-2} );
             }
+            
+            last_valid = r->scene_lines.vertex_count;
          }
+         else
+            last_valid = 0;
+
+         t += 1.0f*mod;
 
-         rnj->current_refs ++;
+         if( t >= 1.0f )
+         {
+            /* TODO special case for end of loop, need to add triangles
+             *      between first and last rungs */
+            break;
+         }
       }
 
-      scene_copy_slice( &r->scene_lines, &route->sm );
+      rnj->current_refs ++;
    }
 
-   if( vg_acquire_thread_sync(1) )
+   scene_copy_slice( &r->scene_lines, &route->sm );
+}
+
+/* 
+ * Create the strips of colour that run through the world along course paths
+ */
+static int world_routes_create_all_meshes(void)
+{
+   vg_info( "Generating route meshes\n" );
+
+   struct subworld_routes *r = &world.routes;
+   scene_init( &r->scene_lines );
+
+   for( u32 i=0; i<r->route_count; i++ )
+      world_routes_create_mesh( i );
+
+   vg_acquire_thread_sync();
    {
-      if( !scene_upload( &r->scene_lines ) )
-      {
-         vg_release_thread_sync(1);
-         return 0;
-      }
+      scene_upload( &r->scene_lines );
 
       /* UI buffers */
-
       for( int i=0; i<r->route_count; i++ )
       {
          /* OpenGL strips */
@@ -880,7 +879,8 @@ static int world_routes_gen_meshes(void)
 
          glBindBuffer( GL_ARRAY_BUFFER, route->ui.vbo );
          glBufferData( GL_ARRAY_BUFFER, k_route_ui_max_verts*stride, 
-               NULL, GL_DYNAMIC_DRAW );
+                       NULL, GL_DYNAMIC_DRAW );
+
          glBindVertexArray( route->ui.vao );
          glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, route->ui.ebo );
          glBufferData( GL_ELEMENT_ARRAY_BUFFER, 
@@ -891,13 +891,8 @@ static int world_routes_gen_meshes(void)
          glEnableVertexAttribArray( 0 );
          VG_CHECK_GL_ERR();
       }
-
-      vg_release_thread_sync(1);
-   }
-   else
-   {
-      return 0;
    }
+   vg_release_thread_sync();
 
    scene_free_offline_buffers( &r->scene_lines );
    return 1;
@@ -910,15 +905,14 @@ static void world_routes_loadfrom( mdl_header *mdl )
 
    struct subworld_routes *r = &world.routes;
    r->nodes = NULL;
-   r->node_count = 0;
-   r->node_cap = 0;
-   r->routes = NULL;
+   r->node_count = 0; r->node_cap = 0; r->routes = NULL;
    r->route_count = 0;
    r->route_cap = 0;
    r->gates = NULL;
    r->gate_count = 0;
    r->gate_cap = 0;
 
+   /* TODO Break this up */
    for( int i=0; i<mdl->node_count; i++ )
    {
       mdl_node *pnode = mdl_node_from_id(mdl,i);
@@ -1087,7 +1081,7 @@ static void world_routes_loadfrom( mdl_header *mdl )
       }
    }
 
-   world_routes_gen_meshes();
+   world_routes_create_all_meshes();
 }
 
 /* 
@@ -1096,24 +1090,22 @@ static void world_routes_loadfrom( mdl_header *mdl )
  * -----------------------------------------------------------------------------
  */
 
-static int world_routes_init(void)
+static void world_routes_init(void)
 {
    struct subworld_routes *r = &world.routes;
    r->current_run_version = 2;
 
    shader_route_register();
    shader_routeui_register();
-
-   return 1;
 }
 
 static void world_routes_free(void*_)
 {
    struct subworld_routes *r = &world.routes;
 
-   free( r->nodes );
-   free( r->routes );
-   free( r->gates );
+   vg_free( r->nodes );
+   vg_free( r->routes );
+   vg_free( r->gates );
 }
 
 static void world_routes_update(void)