X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fdesigner.cpp;h=c2c26da8332e3cc9d016a5af2eb3a48d731f6e12;hb=bd649cbc44e04f5e456ca19b7a32ebe479c130e1;hp=7fbab1fd4cdd705abfdfe877f6de8603ffcf544a;hpb=707a611dae600333f3a9bd6421176f242fe49907;p=r2c2.git diff --git a/source/designer/designer.cpp b/source/designer/designer.cpp index 7fbab1f..c2c26da 100644 --- a/source/designer/designer.cpp +++ b/source/designer/designer.cpp @@ -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 &tracks = layout_3d->get_tracks(); for(list::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 &stracks = selection.get_tracks(); - set 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::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 &tracks = layout->get_tracks(); - float len = 0; - for(set::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 &tracks = selection.get_tracks(); + if(tracks.empty()) + lbl_status->set_text(string()); + else + { + float len = 0; + for(set::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::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())