X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fdesigner.cpp;h=83164b5da169ba05aaf98876754208deec54b5b6;hb=283542ae424b94786652fbf0c67b883b63a8e7a0;hp=92c2f25564b177918a80129fdd1a9b6a26778f88;hpb=258600f95f62ba4fbe745da4aebdd1a496af0050;p=r2c2.git diff --git a/source/designer/designer.cpp b/source/designer/designer.cpp index 92c2f25..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,6 +138,9 @@ Designer::Designer(int argc, char **argv): overlay = new Overlay3D(window, camera, ui_res.get_default_font()); + 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); @@ -144,6 +148,7 @@ Designer::Designer(int argc, char **argv): Designer::~Designer() { + delete camera_ctl; delete overlay; delete root; delete pipeline; @@ -263,7 +268,7 @@ void Designer::tick() window.get_display().tick(); root->tick(); - camera_ctl.tick(dt); + 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); @@ -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) { @@ -479,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; @@ -584,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 Layout3D::TrackMap &tracks = layout_3d->get_tracks(); - for(Layout3D::TrackMap::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - Point tmin; - Point tmax; - i->second->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))