]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/designer.cpp
Don't give out a turnout ID that's already in use
[r2c2.git] / source / designer / designer.cpp
index 7fbab1fd4cdd705abfdfe877f6de8603ffcf544a..c2c26da8332e3cc9d016a5af2eb3a48d731f6e12 100644 (file)
@@ -48,11 +48,13 @@ Designer::Designer(int argc, char **argv):
        mode(SELECT),
        manipulator(*this, selection),
        measure(*this),
-       camera_ctl(window, camera)
+       camera_ctl(window, camera),
+       track_wrap(*this, selection)
 {
        window.set_title("Railway Designer");
        window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Designer::exit), 0));
 
+       selection.signal_changed.connect(sigc::mem_fun(this, &Designer::selection_changed));
        manipulator.signal_status.connect(sigc::mem_fun(this, &Designer::manipulation_status));
        manipulator.signal_done.connect(sigc::mem_fun(this, &Designer::manipulation_done));
        measure.signal_changed.connect(sigc::mem_fun(this, &Designer::measure_changed));
@@ -66,6 +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));
+
        if(argc>1)
        {
                filename = argv[1];
@@ -85,7 +89,8 @@ Designer::Designer(int argc, char **argv):
        pipeline->set_camera(&camera);
        pipeline->add_renderable_for_pass(layout_3d->get_scene(), 0);
        if(base_object)
-               pipeline->add_renderable_for_pass(*base_object, 0);
+               pipeline->add_renderable(*base_object);
+       pipeline->add_renderable_for_pass(track_wrap, "unlit");
        pipeline->add_renderable_for_pass(layout_3d->get_path_scene(), "unlit");
        pipeline->add_renderable_for_pass(layout_3d->get_endpoint_scene(), "unlit");
 
@@ -100,6 +105,11 @@ Designer::Designer(int argc, char **argv):
        pass->depth_test = &GL::DepthTest::lequal();
        pass->blend = &GL::Blend::alpha();
 
+       pass = &pipeline->add_pass("blended");
+       pass->lighting = &lighting;
+       pass->depth_test = &GL::DepthTest::lequal();
+       pass->blend = &GL::Blend::alpha();
+
        camera.set_up_direction(GL::Vector3(0, 0, 1));
        view_all();
 
@@ -130,8 +140,6 @@ Designer::Designer(int argc, char **argv):
        const list<Track3D *> &tracks = layout_3d->get_tracks();
        for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
                update_track_icon(**i);
-
-       edit_route(0);
 }
 
 Designer::~Designer()
@@ -227,13 +235,11 @@ void Designer::add_selection_to_route()
 
        try
        {
-               const set<Track *> &stracks = selection.get_tracks();
-               set<const Track *> tracks(stracks.begin(), stracks.end());
-               cur_route->add_tracks(tracks);
+               cur_route->add_tracks(selection.get_tracks());
        }
        catch(const Exception &e)
        {
-               IO::print("%s\n", e.what());
+               lbl_status->set_text(e.what());
        }
 
        show_route(cur_route);
@@ -255,6 +261,10 @@ void Designer::tick()
        float dt = (t-last_tick)/Msp::Time::sec;
        last_tick = t;
 
+       for(list<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
+               layout_3d->get_track(**i).get_path().set_mask(0);
+       new_tracks.clear();
+
        window.get_display().tick();
        root->tick();
        camera_ctl.tick(dt);
@@ -292,13 +302,7 @@ void Designer::key_press(unsigned key, unsigned mod, wchar_t)
        else if(key==Msp::Input::KEY_PLUS)
                selection.select_more();
        else if(key==Msp::Input::KEY_L && (mod&Input::MOD_SHIFT))
-       {
-               const set<Track *> &tracks = layout->get_tracks();
-               float len = 0;
-               for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-                       len += (*i)->get_type().get_total_length();
-               IO::print("Total length: %.1fm\n", len);
-       }
+               selection.select_blocks();
        else if(key==Msp::Input::KEY_L)
                selection.select_linked();
        else if(key==Msp::Input::KEY_M)
@@ -451,7 +455,6 @@ void Designer::render()
                }
 
                GL::Bind bind_depth(GL::DepthTest::lequal());
-               manipulator.render();
                if(mode==MEASURE)
                        measure.render();
        }
@@ -469,6 +472,11 @@ void Designer::render()
        GL::Texture::unbind();
 }
 
+void Designer::track_added(Track &trk)
+{
+       new_tracks.push_back(&trk);
+}
+
 Track3D *Designer::pick_track(int x, int y)
 {
        Layout3D *l = layout_3d;
@@ -506,6 +514,20 @@ void Designer::update_track_icon(Track3D &track)
        }
 }
 
+void Designer::selection_changed()
+{
+       const set<Track *> &tracks = selection.get_tracks();
+       if(tracks.empty())
+               lbl_status->set_text(string());
+       else
+       {
+               float len = 0;
+               for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+                       len += (*i)->get_type().get_total_length();
+               lbl_status->set_text(format("%.2fm of track selected\n", len));
+       }
+}
+
 void Designer::manipulation_status(const string &status)
 {
        lbl_status->set_text(status);
@@ -513,8 +535,8 @@ void Designer::manipulation_status(const string &status)
 
 void Designer::manipulation_done(bool)
 {
-       lbl_status->set_text(string());
        mode = SELECT;
+       selection_changed();
 }
 
 void Designer::measure_changed()
@@ -529,8 +551,8 @@ void Designer::measure_changed()
 
 void Designer::measure_done()
 {
-       lbl_status->set_text(string());
        mode = SELECT;
+       selection_changed();
 }
 
 void Designer::turnout_id_accept(const string &text)
@@ -611,7 +633,7 @@ void Designer::show_route(const Route *route)
        for(set<Track *>::iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
        {
                Track3D &t3d = layout_3d->get_track(**i);
-               if(route && route->get_tracks().count(*i))
+               if(route && route->has_track(**i))
                {
                        t3d.get_path().set_color(GL::Color(0.5, 0.8, 1.0));
                        if((*i)->get_type().is_turnout())