+ struct route_collector *rc =
+ &world->collectors[ world->collector_count ];
+
+ rc->timing.time = 0.0;
+ rc->timing.version = 0;
+
+ rn->special_id = world->collector_count;
+ world->collector_count ++;
+ }
+ else
+ vg_fatal_exit_loop( "Invalid state" );
+}
+
+/* create route from node description */
+VG_STATIC void world_routes_create_route( world_instance *world,
+ mdl_node *pnode )
+{
+ mdl_context *mdl = world->meta;
+
+ struct classtype_route *inf = mdl_get_entdata( mdl, pnode );
+ struct route *route = &world->routes[ world->route_count ];
+ memset( route, 0, sizeof(struct route) );
+
+ v3_copy( inf->colour, route->colour );
+ route->colour[3] = 1.0f;
+ route->track_id = 0xffffffff;
+
+ for( u32 j=0; j<vg_list_size(track_infos); j++ )
+ {
+ if( !strcmp( mdl_pstr(mdl,pnode->pstr_name), track_infos[j].name ))
+ {
+ route->track_id = j;
+ break;
+ }
+ }
+
+ route->start = world_routes_get_subuid( world, inf->id_start );
+ route->active = 0;
+ route->factive = 0.0f;
+ mdl_node_transform( pnode, route->scoreboard_transform );
+
+ struct route_ui_bar *pui = &world_global.ui_bars[ world->route_count ];
+ pui->indices_head = k_route_ui_max_indices - 9;
+ pui->vertex_head = k_route_ui_max_verts - 200;
+ pui->segment_start = 0;
+ pui->segment_count = 0;
+ pui->fade_start = 0;
+ pui->fade_count = 0;
+ pui->fade_timer_start = 0.0;
+
+ world->route_count ++;
+}
+
+/* load all routes from model header */
+VG_STATIC void world_routes_process( world_instance *world )
+{
+ vg_info( "Initializing routes\n" );
+ mdl_context *mdl = world->meta;
+
+ for( int i=0; i<mdl->info.node_count; i++ )
+ {
+ mdl_node *pnode = mdl_node_from_id(mdl,i);
+
+ if( pnode->classtype == k_classtype_route_node ||
+ pnode->classtype == k_classtype_gate )
+ {
+ struct route_node *rn = world_routes_create_node( world, pnode );
+
+ if( pnode->classtype == k_classtype_gate )
+ {
+ world_routes_process_gate( world, rn, pnode );
+ }
+ else
+ {
+ struct classtype_route_node *inf = mdl_get_entdata( mdl, pnode );
+ rn->next[0] = world_routes_get_subuid( world, inf->target );
+ rn->next[1] = world_routes_get_subuid( world, inf->target1 );
+ }
+ }
+ else if( pnode->classtype == k_classtype_route )
+ {
+ world_routes_create_route( world, pnode );
+ }