X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Fengineer.cpp;h=dc7c49c1ffed44f287b508ce54b0971e7f314e0f;hb=3e9c210ddc036cd015228504cc0803c909e27f84;hp=d5f8495171daecd082a2e43d75670c0952335b49;hpb=aead7f2da831199fbb8f6950b067656b2965c2fa;p=r2c2.git diff --git a/source/engineer/engineer.cpp b/source/engineer/engineer.cpp index d5f8495..dc7c49c 100644 --- a/source/engineer/engineer.cpp +++ b/source/engineer/engineer.cpp @@ -1,3 +1,10 @@ +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + #include #include #include @@ -71,6 +78,7 @@ Engineer::Engineer(int argc, char **argv): layout_3d.set_quality(quality); catalogue.load("tracks.dat"); + catalogue.load("locos.dat"); const vector &args=getopt.get_args(); if(args.empty()) @@ -92,39 +100,40 @@ Engineer::~Engineer() delete trfc_mgr; } -Train *Engineer::add_train(unsigned addr) +void Engineer::add_train() { - if(addr==0) - { - train_prop=new TrainProperties(*this, ui_res, 0); - root->add(*train_prop); - train_prop->signal_ok.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); - train_prop_stale=false; - train_prop->set_visible(true); + train_prop=new TrainProperties(*this, ui_res, 0); + root->add(*train_prop); + train_prop->signal_ok.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); + train_prop_stale=false; + train_prop->set_visible(true); +} - return 0; - } - else - { - Locomotive *loco=new Locomotive(control, addr); - Train *train=new Train(*trfc_mgr, *loco); - train->set_name(format("Train %d", trfc_mgr->get_trains().size())); - - TrainPanel *tpanel=new TrainPanel(*this, ui_res, *train); - root->add(*tpanel); - int y=main_panel->get_geometry().y; - for(TrainPanelSeq::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) - y-=(*i)->get_geometry().h; - tpanel->set_position(0, y-tpanel->get_geometry().h); - train_panels.push_back(tpanel); - tpanel->set_visible(true); - - placing_train=train; - placing_block=0; - main_panel->set_status_text("Select location"); - - return train; - } +Train *Engineer::add_train(const LocoType &type, unsigned addr) +{ + Locomotive *loco=new Locomotive(type, control, addr); + Train *train=new Train(*trfc_mgr, *loco); + train->set_name(format("Train %d", trfc_mgr->get_trains().size())); + + TrainPanel *tpanel=new TrainPanel(*this, ui_res, *train); + root->add(*tpanel); + int y=main_panel->get_geometry().y; + for(list::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) + y-=(*i)->get_geometry().h; + tpanel->set_position(0, y-tpanel->get_geometry().h); + train_panels.push_back(tpanel); + tpanel->set_visible(true); + + place_train(*train); + + return train; +} + +void Engineer::place_train(Train &train) +{ + placing_train=&train; + placing_block=0; + main_panel->set_status_text("Select location"); } int Engineer::main() @@ -213,8 +222,8 @@ void Engineer::tick() glDisable(GL_LIGHTING); glColor4f(1, 1, 1, 1); - const Track3DSeq <racks=layout_3d.get_tracks(); - for(Track3DSeq::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i) + const list <racks=layout_3d.get_tracks(); + for(list::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i) { Track &track=(*i)->get_track(); if(track.get_turnout_id()) @@ -284,9 +293,9 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) { if(placing_train) { - if(btn==1 && placing_block) + if(btn==1 && placing_block && !placing_block->get_train()) { - set_block_color(*placing_block, Color(1, 1, 1)); + set_block_color(*placing_block, GL::Color(1, 1, 1)); placing_train->place(placing_block, placing_entry); placing_train=0; @@ -335,10 +344,10 @@ void Engineer::pointer_motion(int x, int y) if(&block!=placing_block) { if(placing_block) - set_block_color(*placing_block, Color(1, 1, 1)); + reset_block_color(*placing_block); placing_block=█ placing_entry=0; - set_block_color(*placing_block, Color(0.5, 1, 0.7)); + set_block_color(*placing_block, GL::Color(0.5, 1, 0.7)); } } else if(track && track->get_track().get_turnout_id()) @@ -350,7 +359,7 @@ void Engineer::pointer_motion(int x, int y) void Engineer::view_all() { - const Track3DSeq &tracks=layout_3d.get_tracks(); + const list &tracks=layout_3d.get_tracks(); cam_rot=0; float best_height=-1; @@ -362,9 +371,9 @@ void Engineer::view_all() float max_x=0; float min_y=0; float max_y=0; - for(Track3DSeq::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(list::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { - Point minp,maxp; + Point minp, maxp; (*i)->get_bounds(angle, minp, maxp); min_x=min(min_x, minp.x); max_x=max(max_x, maxp.x); @@ -392,59 +401,58 @@ void Engineer::view_all() cam_pos.z=max(best_height*1.05/0.82843, 0.15); } -void Engineer::set_block_color(const Block &block, const Color &color) +void Engineer::set_block_color(const Block &block, const GL::Color &color) { const set &tracks=block.get_tracks(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - layout_3d.get_track(*i)->set_color(color); + layout_3d.get_track(**i).set_color(color); } -void Engineer::sensor_event(bool state, Sensor *sensor) -{ - const list <racks=layout_3d.get_tracks(); - for(list::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i) - if((*i)->get_track().get_sensor_id()==sensor->get_address()) - { - Block &block=trfc_mgr->get_block_by_track((*i)->get_track()); - if(state) - (*i)->set_color(Color(1, 0.5, 0.3)); - else if(block.get_train()) - set_block_color(block, Color(1, 1, 0.3)); - else - (*i)->set_color(Color(1, 1, 1)); - } -} - -void Engineer::block_reserved(const Block &block, const Train *train) +void Engineer::reset_block_color(const Block &block) { if(unsigned sid=block.get_sensor_id()) { Sensor &sensor=control.get_sensor(sid); if(sensor.get_state()) + { + set_block_color(block, GL::Color(1, 0.5, 0.3)); return; + } } - if(train) - set_block_color(block, Color(1, 1, 0.3)); + if(block.get_train()) + set_block_color(block, GL::Color(1, 1, 0.3)); else - set_block_color(block, Color(1, 1, 1)); + set_block_color(block, GL::Color(1, 1, 1)); +} + +void Engineer::sensor_event(bool, Sensor *sensor) +{ + const list &blocks=trfc_mgr->get_blocks(); + for(list::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) + if((*i)->get_sensor_id()==sensor->get_address()) + reset_block_color(**i); +} + +void Engineer::block_reserved(const Block &block, const Train *) +{ + reset_block_color(block); } void Engineer::project_3d() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - //glFrustum(-0.055228, 0.055228, -0.041421, 0.041421, 0.1, 10); - glFrustum(-0.069036, 0.041421, -0.041421, 0.041421, 0.1, 10); + float offset=200.0/screen_w*0.055228; + glFrustum(-0.055228-offset, 0.055228-offset, -0.041421, 0.041421, 0.1, 10); glMatrixMode(GL_MODELVIEW); } Track3D *Engineer::pick_track(int x, int y) { - float xx=((float)(x-(int)screen_w*5/8)/screen_h)*0.82843; - //float xx=((float)(x-(int)screen_w/2)/screen_h)*0.82843; - float yy=((float)y/screen_h-0.5)*0.82843; - float size=(float)4/screen_h*0.82843; + float xx=(static_cast(x-static_cast(screen_w)/2-100)/screen_h)*0.82843; + float yy=(static_cast(y)/screen_h-0.5)*0.82843; + float size=4.0/screen_h*0.82843; project_3d(); glLoadIdentity();