]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Add a common base class for tangible objects
[r2c2.git] / source / libr2c2 / layout.cpp
index a4c7309e472fc30d122b0a532508813cf212be37..4679fd9e166674fec43a8ba01947b015bc8c294c 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);