layout.signal_emergency.connect(sigc::mem_fun(this, &Engineer::set_status));
const set<Block *> &blocks = layout.get_all<Block>();
for(set<Block *>::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
- (*i)->get_sensor().signal_state_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &Engineer::reset_block_color), sigc::ref(**i))));
+ if(Sensor *sensor = (*i)->get_sensor())
+ sensor->signal_state_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &Engineer::reset_block_color), sigc::ref(**i))));
if(FS::exists(options.state_fn))
DataFile::load(layout, options.state_fn);
picking_entry = 0;
delete picking_path;
- picking_path = new Path3D(layout_3d.get_track(*track));
+ picking_path = new Path3D(layout_3d.get<Track3D>(*track));
if(picking_entry>=0)
picking_path->set_mask(picking_track->get_type().get_endpoint(picking_entry).paths);
else
void Engineer::view_all()
{
- const Layout3D::TrackMap &tracks = layout_3d.get_tracks();
+ const Layout3D::ObjectMap &objects = layout_3d.get_all();
float view_aspect = float(window.get_width())/window.get_height();
float view_height = tan(camera.get_field_of_view()/2.0f)*2.0f;
{
Transform trans = Transform::rotation(-angle, Vector(0, 0, 1));
BoundingBox bbox;
- for(Layout3D::TrackMap::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
- bbox = bbox|trans.transform(i->second->get_track().get_bounding_box());
+ for(Layout3D::ObjectMap::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+ bbox = bbox|trans.transform(i->second->get_object().get_bounding_box());
const Vector &minp = bbox.get_minimum_point();
const Vector &maxp = bbox.get_maximum_point();
{
const set<Track *> &tracks = block.get_tracks();
for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
- layout_3d.get_track(**i).get_path().set_color(color);
+ layout_3d.get<Track3D>(**i).get_path().set_color(color);
}
void Engineer::reset_block_color(const Block &block)
{
- bool active = block.get_sensor().get_state()>Sensor::INACTIVE;
+ bool active = false;
+ if(Sensor *sensor = block.get_sensor())
+ active = sensor->get_state()>Sensor::INACTIVE;
if(block.get_train())
{
void Engineer::process_new_train(Train &train)
{
- Vehicle3D &loco3d = layout_3d.get_vehicle(train.get_vehicle(0));
+ Vehicle3D &loco3d = layout_3d.get<Vehicle3D>(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)));
}