X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fdesigner.cpp;h=83164b5da169ba05aaf98876754208deec54b5b6;hb=283542ae424b94786652fbf0c67b883b63a8e7a0;hp=c2c26da8332e3cc9d016a5af2eb3a48d731f6e12;hpb=a78b546b0a1ff9fb073742a267fb49b6f2560a31;p=r2c2.git diff --git a/source/designer/designer.cpp b/source/designer/designer.cpp index c2c26da..83164b5 100644 --- a/source/designer/designer.cpp +++ b/source/designer/designer.cpp @@ -6,6 +6,7 @@ Distributed under the GPL */ #include +#include #include #include #include @@ -48,7 +49,6 @@ Designer::Designer(int argc, char **argv): mode(SELECT), manipulator(*this, selection), measure(*this), - camera_ctl(window, camera), track_wrap(*this, selection) { window.set_title("Railway Designer"); @@ -69,6 +69,7 @@ Designer::Designer(int argc, char **argv): 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)); if(argc>1) { @@ -111,7 +112,7 @@ Designer::Designer(int argc, char **argv): pass->blend = &GL::Blend::alpha(); camera.set_up_direction(GL::Vector3(0, 0, 1)); - view_all(); + camera.set_look_direction(GL::Vector3(0, 0.5, -0.866)); // Setup UI DataFile::load(ui_res, "marklin.res"); @@ -137,13 +138,17 @@ Designer::Designer(int argc, char **argv): overlay = new Overlay3D(window, camera, ui_res.get_default_font()); - const list &tracks = layout_3d->get_tracks(); - for(list::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - update_track_icon(**i); + camera_ctl = new CameraController(*this, *root, camera); + camera_ctl->view_all(); + + const Layout3D::TrackMap &tracks = layout_3d->get_tracks(); + for(Layout3D::TrackMap::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + update_track_icon(*i->second); } Designer::~Designer() { + delete camera_ctl; delete overlay; delete root; delete pipeline; @@ -261,14 +266,14 @@ void Designer::tick() float dt = (t-last_tick)/Msp::Time::sec; last_tick = t; + window.get_display().tick(); + root->tick(); + camera_ctl->tick(dt); + 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); - render(); window.swap_buffers(); @@ -279,7 +284,12 @@ void Designer::key_press(unsigned key, unsigned mod, wchar_t) key = Input::key_from_sys(key); mod = Input::mod_from_sys(mod); - if(key==Msp::Input::KEY_N) + if(key==Msp::Input::KEY_N && (mod&Input::MOD_SHIFT)) + { + manipulator.start_extend(); + mode = MANIPULATE; + } + else if(key==Msp::Input::KEY_N) new_track(); else if(key==Msp::Input::KEY_G) { @@ -362,6 +372,8 @@ void Designer::key_press(unsigned key, unsigned mod, wchar_t) set_sensor_id(); else if(key==Msp::Input::KEY_A) add_selection_to_route(); + else if(key==Msp::Input::KEY_C) + manipulator.connect(); } void Designer::button_press(int x, int y, unsigned btn, unsigned mod) @@ -477,6 +489,13 @@ void Designer::track_added(Track &trk) new_tracks.push_back(&trk); } +void Designer::track_removed(Track &trk) +{ + list::iterator i = find(new_tracks.begin(), new_tracks.end(), &trk); + if(i!=new_tracks.end()) + new_tracks.erase(i); +} + Track3D *Designer::pick_track(int x, int y) { Layout3D *l = layout_3d; @@ -582,31 +601,6 @@ void Designer::route_name_accept(const string &text) cur_route->set_name(text); } -void Designer::view_all() -{ - Point minp; - Point maxp; - - const list &tracks = layout_3d->get_tracks(); - for(list::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - Point tmin; - Point tmax; - (*i)->get_bounds(0, tmin, tmax); - minp.x = min(minp.x, tmin.x); - minp.y = min(minp.y, tmin.y); - maxp.x = max(maxp.x, tmax.x); - maxp.y = max(maxp.y, tmax.y); - } - - float t = tan(camera.get_field_of_view()/2)*2; - float size = max((maxp.y-minp.y+0.1), (maxp.x-minp.x+0.1)/camera.get_aspect()); - float cam_dist = size/t+size*0.25; - Point center((minp.x+maxp.x)/2, (minp.y+maxp.y)/2); - camera.set_position(GL::Vector3(center.x, center.y-cam_dist*0.5, cam_dist*0.866)); - camera.set_look_direction(GL::Vector3(0, 0.5, -0.866)); -} - string Designer::tooltip(int x, int y) { if(Track3D *t3d = pick_track(x, y))