- struct route_node *ri = &r->nodes[i],
- *rj = NULL;
-
- for( int j=0; j<2; j++ )
- {
- if( ri->next[j] != 0xffffffff )
- {
- rj = &r->nodes[ri->next[j]];
- vg_line( ri->co, rj->co, 0x20ffffff );
+ scene_upload( world->scene_lines, &world->mesh_route_lines );
+ }
+ vg_release_thread_sync();
+ vg_linear_del( world_global.generic_heap, world->scene_lines );
+
+ world_routes_clear( world );
+}
+
+/* load all routes from model header */
+VG_STATIC void world_routes_ent_init( world_instance *world )
+{
+ vg_info( "Initializing routes\n" );
+
+ for( u32 i=0; i<mdl_arrcount(&world->ent_gate); i++ ){
+ ent_gate *gate = mdl_arritm( &world->ent_gate, i );
+ for( u32 j=0; j<4; j++ ){
+ gate->routes[j] = 0xffff;
+ }
+ }
+
+ for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+ ent_route *route = mdl_arritm(&world->ent_route,i);
+ mdl_transform_m4x3( &route->transform, route->board_transform );
+
+ route->official_track_id = 0xffffffff;
+ for( u32 j=0; j<vg_list_size(track_infos); j ++ ){
+ if( !strcmp(track_infos[j].name,
+ mdl_pstr(&world->meta,route->pstr_name))){
+ route->official_track_id = j;
+ }
+ }
+
+ for( u32 j=0; j<route->checkpoints_count; j++ ){
+ u32 id = route->checkpoints_start + j;
+ ent_checkpoint *cp = mdl_arritm(&world->ent_checkpoint,id);
+
+ ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index );
+
+ for( u32 k=0; k<4; k++ ){
+ if( gate->routes[k] == 0xffff ){
+ gate->routes[k] = i;
+ break;
+ }
+ }
+
+ if( gate->type == k_gate_type_teleport ){
+ gate = mdl_arritm(&world->ent_gate, gate->target );
+
+ for( u32 k=0; k<4; k++ ){
+ if( gate->routes[k] == i ){
+ vg_error( "already assigned route to gate\n" );
+ break;
+ }
+ if( gate->routes[k] == 0xffff ){
+ gate->routes[k] = i;
+ break;
+ }
+ }