X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Fengineer.cpp;h=ea5139d5b2e9d9e94cc7ebbdd2455bf72f959c2d;hb=43638fd7170c5c8290212c38c3eaf623b8c1b415;hp=371e82e49e7c4d4fc6b69315be3e0ca1b355d4a6;hpb=c87c4200e105a21c1d1f9faec20c4c08ddbb53ee;p=r2c2.git diff --git a/source/engineer/engineer.cpp b/source/engineer/engineer.cpp index 371e82e..ea5139d 100644 --- a/source/engineer/engineer.cpp +++ b/source/engineer/engineer.cpp @@ -23,6 +23,7 @@ Distributed under the GPL #include #include #include +#include #include "libmarklin/driver.h" #include "libmarklin/tracktype.h" #include "3d/path.h" @@ -44,9 +45,10 @@ Engineer::Engineer(int argc, char **argv): layout_3d(layout), server(0), pipeline(window.get_width(), window.get_height(), false), - placing_train(0), - placing_block(0), - placing_entry(0) + picking(false), + picking_track(0), + picking_entry(0), + picking_path(0) { // Setup GUI window.set_title("Railroad Engineer"); @@ -123,11 +125,17 @@ Engineer::~Engineer() delete server; } -void Engineer::place_train(Train &train) +void Engineer::set_status(const string &text) { - placing_train = &train; - placing_block = 0; - main_panel->set_status_text("Select location"); + main_panel->set_status_text(text); + status_timeout = Time::now()+10*Time::sec; +} + +void Engineer::pick(bool with_ep) +{ + picking = true; + picking_track = 0; + picking_entry = (with_ep ? 0 : -1); } int Engineer::main() @@ -144,22 +152,30 @@ void Engineer::tick() layout.tick(); event_disp.tick(Time::zero); + if(status_timeout && Time::now()>status_timeout) + { + main_panel->set_status_text(string()); + status_timeout = Time::TimeStamp(); + } + GL::clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT); pipeline.render_all(); - layout_3d.get_path_scene().render(); + { + GL::Bind depth(GL::DepthTest::lequal()); + layout_3d.get_path_scene().render(); + } { GL::Bind blend(GL::Blend::alpha()); overlay->render(0); } - if(placing_train && placing_block) + if(picking && picking_track && picking_entry>=0) { GL::PushMatrix push_mat; - const Marklin::Block::Endpoint &bep = placing_block->get_endpoints()[placing_entry]; - float rot = bep.track->get_endpoint_direction(bep.track_ep); - Point pos = bep.track->get_endpoint_position(bep.track_ep); + float rot = picking_track->get_endpoint_direction(picking_entry); + Point pos = picking_track->get_endpoint_position(picking_entry); GL::translate(pos.x, pos.y, pos.z+0.03); GL::rotate(rot*180/M_PI+180, 0, 0, 1); @@ -185,20 +201,19 @@ void Engineer::tick() void Engineer::button_press(int x, int y, unsigned btn, unsigned) { - if(placing_train) + if(picking) { - if(btn==1 && placing_block && !placing_block->get_train()) + if(btn==1 && picking_track) { - reset_block_color(*placing_block); - - placing_train->place(*placing_block, placing_entry); - placing_train = 0; - main_panel->set_status_text(string()); + picking = false; + delete picking_path; + picking_path = 0; + signal_pick_done.emit(picking_track, picking_entry); } - else if(btn==3) + else if(btn==3 && picking_entry>=0) { - const vector &endpoints = placing_block->get_endpoints(); - placing_entry = (placing_entry+1)%endpoints.size(); + picking_entry = (picking_entry+1)%picking_track->get_type().get_endpoints().size(); + picking_path->set_mask(picking_track->get_type().get_endpoints()[picking_entry].paths); } } else @@ -211,7 +226,7 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) { Block &block = layout.get_block_by_track(track); if(block.get_train() && !block.get_train()->free_block(block)) - main_panel->set_status_text("Turnout busy"); + set_status("Turnout is busy"); else { unsigned paths = track.get_type().get_paths(); @@ -240,21 +255,23 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) void Engineer::pointer_motion(int x, int y) { - if(placing_train) + if(picking) { Track3D *track = pick_track(x, window.get_height()-y-1); - if(track) + if(track && &track->get_track()!=picking_track) { - Block &block = layout.get_block_by_track(track->get_track()); - if(&block!=placing_block) - { - if(placing_block) - reset_block_color(*placing_block); - placing_block = █ - placing_entry = 0; - if(!placing_block->get_train()) - set_block_color(*placing_block, GL::Color(0)); - } + picking_track = &track->get_track(); + if(picking_entry>=0) + picking_entry = 0; + + delete picking_path; + picking_path = new Path3D(*track); + if(picking_entry>=0) + picking_path->set_mask(picking_track->get_type().get_endpoints()[picking_entry].paths); + else + picking_path->set_mask(picking_track->get_type().get_paths()); + picking_path->set_color(GL::Color(0)); + picking_path->set_layer(1); } } } @@ -308,6 +325,7 @@ void Engineer::view_all() camera.set_position(pos); camera.set_up_direction(up); camera.set_look_direction(GL::Vector3(0, 0, -1)); + camera.set_depth_clip(pos.z*0.5, pos.z*1.5); } void Engineer::set_block_color(const Block &block, const GL::Color &color)