]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackattachment.cpp
Correct TrackAttachment entry endpoint
[r2c2.git] / source / libr2c2 / trackattachment.cpp
index eb2d563561c6fcf7864d00c1a8a170f943c7e624..9e3d244056602dd33684daddafe6ff799d21faa2 100644 (file)
@@ -8,8 +8,7 @@ using namespace std;
 namespace R2C2 {
 
 TrackAttachment::TrackAttachment(Layout &l):
-       Object(l),
-       offset(0)
+       Object(l)
 {
        layout.signal_object_removed.connect(sigc::mem_fun(this, &TrackAttachment::object_removed));
 }
@@ -23,18 +22,17 @@ TrackAttachment::~TrackAttachment()
 float TrackAttachment::get_offset_from_endpoint(unsigned epi) const
 {
        if(epi==track.entry())
-               return offset;
+               return track.offset();
        else
-               return track->get_type().get_path_length(0)-offset;
+               return track->get_type().get_path_length(0)-track.offset();
 }
 
-void TrackAttachment::attach_to(const TrackIter &t, float o)
+void TrackAttachment::attach_to(const TrackOffsetIter &t)
 {
        if(track)
                track->remove_attachment(*this);
 
        track = t;
-       offset = o;
 
        if(track)
                track->add_attachment(*this);
@@ -52,7 +50,8 @@ void TrackAttachment::attach_to_closest(float limit)
                        Snap sn;
                        sn.position = position;
                        sn.rotation = rotation;
-                       if((*i)->snap(sn, limit, SNAP_SEGMENT))
+                       float gauge = (*i)->get_type().get_gauge();
+                       if((*i)->snap(sn, gauge*limit, SNAP_SEGMENT))
                        {
                                float d = distance(position, sn.position);
                                if(d<dist || dist<0)
@@ -70,17 +69,17 @@ void TrackAttachment::attach_to_closest(float limit)
                for(unsigned i=0; i<nsn; ++i)
                {
                        Snap sn = trk->get_snap_node(i);
-                       Angle adiff = abs(wrap_balanced(sn.rotation-rotation));
+                       Angle adiff = abs(wrap_balanced(sn.rotation+Angle::half_turn()-rotation));
                        if(adiff<Angle::quarter_turn())
                        {
                                TrackIter iter(trk, i);
-                               attach_to(iter, find_offset(iter, closest));
+                               attach_to(TrackOffsetIter(iter, find_offset(iter, closest)));
                                break;
                        }
                }
        }
        else
-               attach_to(TrackIter(), 0);
+               attach_to(TrackOffsetIter());
 }
 
 float TrackAttachment::find_offset(const TrackIter &trk, const Vector &point)
@@ -92,8 +91,8 @@ float TrackAttachment::find_offset(const TrackIter &trk, const Vector &point)
        float offs = min(dist, trk->get_type().get_path_length(0));
        while(1)
        {
-               TrackPoint tp = trk->get_point(trk.entry(), offs);
-               float diff = dist-distance(epp, tp.pos);
+               OrientedPoint p = trk->get_point(trk.entry(), offs);
+               float diff = dist-distance(epp, p.position);
                if(abs(diff)<margin)
                        break;
                offs += diff;