]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/engineer.cpp
Do not render unplaced vehicles
[r2c2.git] / source / engineer / engineer.cpp
index 4a35c8e0cd381bc6307f24e828c8352d68152239..c8092872c4dc0e0b3314115329fabd8562d6b017 100644 (file)
@@ -27,6 +27,8 @@ Distributed under the GPL
 #include "libmarklin/driver.h"
 #include "libmarklin/tracktype.h"
 #include "3d/path.h"
+#include "3d/track.h"
+#include "3d/vehicle.h"
 #include "engineer.h"
 #include "mainpanel.h"
 #include "trainpanel.h"
@@ -48,7 +50,10 @@ Engineer::Engineer(int argc, char **argv):
        picking(false),
        picking_track(0),
        picking_entry(0),
-       picking_path(0)
+       picking_path(0),
+       pointer_x(0),
+       pointer_y(0),
+       pointer_moved(false)
 {
        // Setup GUI
        window.set_title("Railroad Engineer");
@@ -70,10 +75,12 @@ Engineer::Engineer(int argc, char **argv):
        // Setup railroad control
        DataFile::load(catalogue, "tracks.dat");
        DataFile::load(catalogue, "locos.dat");
+       DataFile::load(catalogue, "wagons.dat");
        DataFile::load(layout, options.layout_fn);
 
        layout.signal_train_added.connect(sigc::mem_fun(this, &Engineer::train_added));
        layout.signal_block_reserved.connect(sigc::mem_fun(this, &Engineer::block_reserved));
+       layout.signal_emergency.connect(sigc::mem_fun(this, &Engineer::set_status));
        layout.get_driver().signal_sensor.connect(sigc::mem_fun(this, &Engineer::sensor_event));
        if(FS::exists("engineer.state"))
                DataFile::load(layout, "engineer.state");
@@ -112,7 +119,7 @@ Engineer::~Engineer()
 {
        const map<unsigned, Train *> &trains = layout.get_trains();
        for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
-               i->second->set_speed(0);
+               layout.get_driver().set_loco_speed(i->first, 0);
        layout.get_driver().flush();
 
        if(!options.simulate)
@@ -169,6 +176,31 @@ void Engineer::tick()
                overlay->render(0);
        }
 
+       if(pointer_moved)
+       {
+               pointer_moved = false;
+
+               if(picking)
+               {
+                       Track3D *track = pick_track(pointer_x, window.get_height()-pointer_y-1);
+                       if(track && &track->get_track()!=picking_track)
+                       {
+                               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);
+                       }
+               }
+       }
+
        if(picking && picking_track && picking_entry>=0)
        {
                GL::PushMatrix push_mat;
@@ -251,25 +283,9 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned)
 
 void Engineer::pointer_motion(int x, int y)
 {
-       if(picking)
-       {
-               Track3D *track = pick_track(x, window.get_height()-y-1);
-               if(track && &track->get_track()!=picking_track)
-               {
-                       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);
-               }
-       }
+       pointer_x = x;
+       pointer_y = y;
+       pointer_moved = true;
 }
 
 void Engineer::view_all()
@@ -321,6 +337,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_aspect(float(window.get_width())/window.get_height());
        camera.set_depth_clip(pos.z*0.5, pos.z*1.5);
 }
 
@@ -391,9 +408,9 @@ void Engineer::train_added(Train &train)
        train_panels.push_back(tpanel);
        tpanel->set_visible(true);
 
-       Train3D &t3d = layout_3d.get_train(train);
-       overlay->set_label(t3d, train.get_name());
-       train.signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(overlay, &Overlay3D::set_label), sigc::ref(t3d)));
+       Vehicle3D &loco3d = layout_3d.get_vehicle(train.get_vehicle(0));
+       overlay->set_label(loco3d, train.get_name());
+       train.signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(overlay, &Overlay3D::set_label), sigc::ref(loco3d)));
 
        GL::Color best_color;
        float best_d_sq = 0;
@@ -431,7 +448,7 @@ void Engineer::sighandler(int sig)
                IO::print(IO::cerr, "Fatal signal received, terminating\n");
                const map<unsigned, Train *> &trains = layout.get_trains();
                for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
-                       i->second->set_speed(0);
+                       layout.get_driver().set_loco_speed(i->first, 0);
                layout.get_driver().flush();
                raise(sig);
        }