- struct subworld_routes *r = &world.routes;
- r->nodes = 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);
- m4x3f transform;
-
- if( pnode->classtype == k_classtype_route_node ||
- pnode->classtype == k_classtype_gate )
- {
- mdl_node_transform( pnode, transform );
- pnode->sub_uid = r->node_count;
-
- r->nodes = buffer_reserve( r->nodes, r->node_count, &r->node_cap, 1,
- sizeof( struct route_node ) );
-
- struct route_node *rn = &r->nodes[r->node_count];
-
- v3_copy( transform[0], rn->right );
- v3_normalize( rn->right );
- v3_copy( transform[1], rn->up );
- v3_normalize( rn->up );
- v3_muls( transform[2], -1.0f, rn->h );
- v3_copy( transform[3], rn->co );
- rn->ref_count = 0;
- rn->current_refs = 0;
- rn->special_type = 0;
- rn->special_id = 0;
-
- if( pnode->classtype == k_classtype_gate )
- {
- struct classtype_gate *inf = mdl_get_entdata( mdl, pnode );
-
- /* H is later scaled based on link distance */
- v3_normalize( rn->h );
- rn->next[0] = inf->target;
- rn->next[1] = 0;
-
- /* TODO */
- if( inf->target )
- {
- mdl_node *pother = mdl_node_from_id( mdl, inf->target );
-
- if( pother->classtype == k_classtype_gate )
- {
- r->gates = buffer_reserve( r->gates, r->gate_count,
- &r->gate_cap,
- 1, sizeof( struct route_gate ) );
-
- struct route_gate *rg = &r->gates[r->gate_count];
- rg->node_id = r->node_count;
- rg->timing.time = 0.0;
- rg->timing.version = 0;
-
- v3_copy( pnode->co, rg->gate.co[0] );
- v3_copy( pother->co, rg->gate.co[1] );
- v4_copy( pnode->q, rg->gate.q[0] );
- v4_copy( pother->q, rg->gate.q[1] );
- v2_copy( inf->dims, rg->gate.dims );
-
- gate_transform_update( &rg->gate );
- rn->special_type = k_route_special_type_gate;
- rn->special_id = r->gate_count;
-
- r->gate_count ++;
- }
- }
+ shader_scene_route_use();
+ shader_scene_route_uTexGarbage(0);
+ world_link_lighting_ub( world, _shader_scene_route.id );
+ world_bind_position_texture( world, _shader_scene_route.id,
+ _uniform_scene_route_g_world_depth, 2 );
+ world_bind_light_array( world, _shader_scene_route.id,
+ _uniform_scene_route_uLightsArray, 3 );
+ world_bind_light_index( world, _shader_scene_route.id,
+ _uniform_scene_route_uLightsIndex, 4 );
+ bind_terrain_noise();
+
+ shader_scene_route_uPv( cam->mtx.pv );
+ shader_scene_route_uPvmPrev( cam->mtx_prev.pv );
+ shader_scene_route_uMdl( identity_matrix );
+ shader_scene_route_uCamera( cam->transform[3] );
+ shader_scene_route_uBoard0( TEMP_BOARD_0 );
+ shader_scene_route_uBoard1( TEMP_BOARD_1 );
+
+ mesh_bind( &world->mesh_route_lines );
+
+ for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+ ent_route *route = mdl_arritm( &world->ent_route, i );