- unsigned result = ROUTE_SMOOTH;
- const vector<Track *> &links = trk.get_links();
- for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
- {
- if(!*i)
- continue;
- if(!tracks.count(*i))
- continue;
-
- // Linked to an existing track - good
- result |= ROUTE_LINKED;
-
- if(unsigned tid = (*i)->get_turnout_id())
- {
- const TrackType::Endpoint &ep = (*i)->get_type().get_endpoint((*i)->get_endpoint_by_link(trk));
- int path = get_turnout(tid);
- if(path>=0)
- {
- // Linking to a turnout with path set is only good if we're continuing that path
- if(ep.paths&(1<<path))
- result |= ROUTE_LINEAR;
- }
- else
- {
- // Linked to a turnout with no path set - check other linked tracks
- const vector<Track *> &tlinks = (*i)->get_links();
- unsigned count = 0;
- for(unsigned j=0; j<tlinks.size(); ++j)
- if(tracks.count(tlinks[j]))
- {
- unsigned tid2 = tlinks[j]->get_turnout_id();
- if(tid2)
- {
- const TrackType::Endpoint &ep2 = tlinks[j]->get_type().get_endpoint(tlinks[j]->get_endpoint_by_link(**i));
- path = get_turnout(tid2);
- // Ignore a linked turnout with some other path set
- if(path>=0 && !(ep2.paths&(1<<path)))
- continue;
- }
-
- ++count;
-
- const TrackType::Endpoint &ep2 = (*i)->get_type().get_endpoint(j);
- if(!(ep.paths&ep2.paths))
- // Impossible path through the turnout - not good
- result &= ~ROUTE_SMOOTH;
- }
-
- // Only good if at most one other track is linked to the turnout
- if(count<=1)
- result |= ROUTE_LINEAR;
- }
- }
- else
- // Linked to something linear - good
- result |= ROUTE_LINEAR;
- }
-
- return static_cast<RouteValidityMask>(result);
-}
-
-void Route::track_removed(Track &t)
-{
- tracks.erase(&t);