]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Perform check_slope automatically with certain operations
[r2c2.git] / source / libr2c2 / layout.cpp
index a4c7309e472fc30d122b0a532508813cf212be37..45b18e322fa6e8db5a065fb616e002b869b206a8 100644 (file)
@@ -74,11 +74,7 @@ void Layout::add_track(Track &t)
 
 Track *Layout::pick_track(const Vector &start, const Vector &ray)
 {
-  for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
-     if((*i)->collide_ray(start, ray))
-        return *i;
-
-       return 0;
+       return pick(tracks, start, ray);
 }
 
 void Layout::remove_track(Track &t)
@@ -111,12 +107,36 @@ void Layout::add_signal(Signal &s)
                signal_signal_added.emit(s);
 }
 
+Signal *Layout::pick_signal(const Vector &start, const Vector &ray)
+{
+       return pick(signals, start, ray);
+}
+
 void Layout::remove_signal(Signal &s)
 {
        if(signals.erase(&s))
                signal_signal_removed.emit(s);
 }
 
+Object *Layout::pick_object(const Vector &start, const Vector &ray)
+{
+       if(Object *obj = pick_track(start, ray))
+               return obj;
+       else if((obj = pick_signal(start, ray)))
+               return obj;
+       return 0;
+}
+
+template<typename T>
+T *Layout::pick(const set<T *> &objs, const Vector &start, const Vector &ray)
+{
+       for(typename set<T *>::const_iterator i=objs.begin(); i!=objs.end(); ++i)
+               if((*i)->collide_ray(start, ray))
+                       return *i;
+
+       return 0;
+}
+
 void Layout::add_block(Block &b)
 {
        blocks.insert(&b);
@@ -385,12 +405,6 @@ Layout::Loader::Loader(Layout &l):
        add("train", static_cast<void (Loader::*)(unsigned, unsigned, const std::string &)>(&Loader::train));
 }
 
-void Layout::Loader::finish()
-{
-       for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
-               (*i)->check_slope();
-}
-
 void Layout::Loader::route()
 {
        Route *rte = new Route(obj);
@@ -422,7 +436,7 @@ void Layout::Loader::track(ArticleNumber art_nr)
        new_tracks = true;
        for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
                if(*i!=trk)
-                       trk->snap_to(**i, true);
+                       trk->link_to(**i);
 }
 
 void Layout::Loader::train(unsigned art_nr, unsigned addr, const std::string &proto)