]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/designer.cpp
Better algorithms for dealing with turnouts in a Route
[r2c2.git] / source / designer / designer.cpp
index 6d2fd41eca30c17451b1babc510b13796f064e96..d640073427c5c936ce2ceb53ced27d9a0472775f 100644 (file)
@@ -47,6 +47,7 @@ Designer::Designer(int argc, char **argv):
        cur_route(0),
        cur_zone(0),
        mode(SELECT),
+       sel_wrap(selection),
        manipulator(*this, mouse, selection),
        measure(*this)
 {
@@ -67,8 +68,8 @@ Designer::Designer(int argc, char **argv):
        layout = new Layout(catalogue);
        layout_3d = new Layout3D(*layout);
 
-       layout->signal_track_added.connect(sigc::mem_fun(this, &Designer::track_added));
-       layout->signal_track_removed.connect(sigc::mem_fun(this, &Designer::track_removed));
+       layout->signal_object_added.connect(sigc::mem_fun(this, &Designer::object_added));
+       layout->signal_object_removed.connect(sigc::mem_fun(this, &Designer::object_removed));
 
        if(argc>1)
        {
@@ -133,8 +134,7 @@ Designer::Designer(int argc, char **argv):
        statusbar->add(*lbl_status);
        lbl_status->set_geometry(GLtk::Geometry(20, 2, 300, 16));
 
-       track_wrap = new TrackWrap(*layout_3d, selection);
-       pipeline->add_renderable_for_pass(*track_wrap, "unlit");
+       pipeline->add_renderable_for_pass(sel_wrap, "unlit");
        overlay = new Overlay3D(ui_res.get_default_font());
        pipeline->add_renderable_for_pass(*overlay, "overlay");
        pipeline->add_renderable_for_pass(measure, "unlit");
@@ -154,7 +154,6 @@ Designer::~Designer()
        for(vector<Toolbar *>::iterator i=toolbars.begin(); i!=toolbars.end(); ++i)
                delete *i;
        delete camera_ctl;
-       delete track_wrap;
        delete overlay;
        delete main_view;
        delete base_object;
@@ -413,7 +412,7 @@ void Designer::key_press(unsigned key)
        else if(key==Msp::Input::KEY_F && shift)
        {
                const set<Track *> &tracks = selection.get_objects<Track>();
-               const set<Track *> &ltracks = layout->get_tracks();
+               const set<Track *> &ltracks = layout->get_all<Track>();
                for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
                {
                        (*i)->set_flex(!(*i)->get_flex());
@@ -514,16 +513,20 @@ void Designer::render()
        glColor3f(1.0, 1.0, 1.0);
 }
 
-void Designer::track_added(Track &trk)
+void Designer::object_added(Object &obj)
 {
-       new_tracks.push_back(&trk);
+       if(Track *trk = dynamic_cast<Track *>(&obj))
+               new_tracks.push_back(trk);
 }
 
-void Designer::track_removed(Track &trk)
+void Designer::object_removed(Object &obj)
 {
-       list<Track *>::iterator i = find(new_tracks.begin(), new_tracks.end(), &trk);
-       if(i!=new_tracks.end())
-               new_tracks.erase(i);
+       if(Track *trk = dynamic_cast<Track *>(&obj))
+       {
+               list<Track *>::iterator i = find(new_tracks.begin(), new_tracks.end(), trk);
+               if(i!=new_tracks.end())
+                       new_tracks.erase(i);
+       }
 }
 
 Object *Designer::pick_object(const Vector &pointer)
@@ -532,7 +535,7 @@ Object *Designer::pick_object(const Vector &pointer)
        const GL::Vector3 &cpos = view.get_camera().get_position();
        GL::Vector4 cray = view.get_camera().unproject(GL::Vector4(pointer.x, pointer.y, 0, 0));
 
-       return view.get_layout().get_layout().pick_object(Vector(cpos.x, cpos.y, cpos.z), Vector(cray.x, cray.y, cray.z));
+       return view.get_layout().get_layout().pick<Object>(Ray(cpos, Vector(cray)));
 }
 
 void Designer::update_track_icon(Track3D &track)
@@ -652,7 +655,7 @@ string Designer::tooltip(int x, int y)
 
 void Designer::clear_paths()
 {
-       const set<Track *> &ltracks = layout->get_tracks();
+       const set<Track *> &ltracks = layout->get_all<Track>();
        for(set<Track *>::iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
        {
                Track3D &t3d = layout_3d->get_track(**i);