]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Make use of the geometry part of libmspmath
[r2c2.git] / source / libr2c2 / layout.cpp
index a4c7309e472fc30d122b0a532508813cf212be37..c70ebb7b3879f0d528c5864bb594712093869d72 100644 (file)
@@ -72,13 +72,9 @@ void Layout::add_track(Track &t)
        }
 }
 
-Track *Layout::pick_track(const Vector &start, const Vector &ray)
+Track *Layout::pick_track(const Ray &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, 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 Ray &ray)
+{
+       return pick(signals, ray);
+}
+
 void Layout::remove_signal(Signal &s)
 {
        if(signals.erase(&s))
                signal_signal_removed.emit(s);
 }
 
+Object *Layout::pick_object(const Ray &ray)
+{
+       if(Object *obj = pick_track(ray))
+               return obj;
+       else if((obj = pick_signal(ray)))
+               return obj;
+       return 0;
+}
+
+template<typename T>
+T *Layout::pick(const set<T *> &objs, const Ray &ray)
+{
+       for(typename set<T *>::const_iterator i=objs.begin(); i!=objs.end(); ++i)
+               if((*i)->collide_ray(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)