]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/track.cpp
Count reserved distance correctly in reverse direction
[r2c2.git] / source / libr2c2 / track.cpp
index 7b5e1a2315a81f079fbec8670a1905bfae2f9838..71c570cee86ccd251d6269c080b1c619bac18054 100644 (file)
@@ -26,7 +26,7 @@ Track::Track(Layout &l, const TrackType &t):
        if(type.is_turnout())
                turnout_id = layout.allocate_turnout_id();
 
-       layout.add_track(*this);
+       layout.add(*this);
 
        if(layout.has_driver())
                layout.get_driver().signal_turnout.connect(sigc::mem_fun(this, &Track::turnout_event));
@@ -37,7 +37,7 @@ Track::Track(Layout &l, const TrackType &t):
 Track::~Track()
 {
        break_links();
-       layout.remove_track(*this);
+       layout.remove(*this);
 }
 
 Track *Track::clone(Layout *to_layout) const
@@ -106,7 +106,6 @@ void Track::check_slope()
        }
        else
        {
-               slope = 0;
                if(links[0])
                {
                        Vector epp = links[0]->get_snap_node(links[0]->get_link_slot(*this)).position;
@@ -115,7 +114,7 @@ void Track::check_slope()
                else if(links[1])
                {
                        Vector epp = links[1]->get_snap_node(links[1]->get_link_slot(*this)).position;
-                       position.z = epp.z;
+                       position.z = epp.z-slope;
                }
        }
 }
@@ -124,6 +123,8 @@ void Track::set_turnout_id(unsigned i)
 {
        if(!type.is_turnout())
                throw logic_error("not a turnout");
+       if(!i)
+               throw invalid_argument("Track::set_turnout_id");
 
        turnout_id = i;
        layout.create_blocks(*this);
@@ -150,6 +151,7 @@ void Track::set_active_path(unsigned p)
        if(!(type.get_paths()&(1<<p)))
                throw invalid_argument("Track::set_active_path");
 
+       signal_path_changing(p);
        path_changing = true;
        layout.get_driver().set_turnout(turnout_id, p);
 }
@@ -317,17 +319,6 @@ bool Track::break_link(unsigned i)
        return true;
 }
 
-bool Track::collide_ray(const Vector &start, const Vector &ray) const
-{
-       Transform trans = Transform::rotation(-rotation, Vector(0, 0, 1));
-       Vector local_start = trans.transform(start-position);
-       Vector local_ray = trans.transform(ray);
-
-       float width = layout.get_catalogue().get_ballast_profile().get_width();
-
-       return type.collide_ray(local_start, local_ray, width);
-}
-
 void Track::save(list<DataFile::Statement> &st) const
 {
        st.push_back((DataFile::Statement("position"), position.x, position.y, position.z));