]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/movetool.cpp
Use any snap nodes without links as boundaries
[r2c2.git] / source / designer / movetool.cpp
index c7bae59cd9a8f010d324d908b5f45699bcfd8d8e..72bbc19ec3e8de206ccb64e3ce196e31709d7048 100644 (file)
@@ -6,15 +6,29 @@ using namespace std;
 using namespace Msp;
 using namespace R2C2;
 
-MoveTool::MoveTool(Designer &d, Input::Mouse &m, const set<Object *> &o):
-       Manipulator(d, m, o),
+MoveTool::MoveTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, const set<Object *> &o):
+       Manipulator(d, k, m, o),
        origin(ground_pointer)
-{ }
-
-void MoveTool::axis_motion(unsigned axis, float value, float rel)
 {
-       Manipulator::axis_motion(axis, value, rel);
+       for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
+       {
+               unsigned nls = i->object->get_n_link_slots();
+               unsigned nsn = i->object->get_n_snap_nodes();
+               unsigned j;
+               for(j=0; j<nls; ++j)
+                       if(!o.count(i->object->get_link(j)))
+                               boundaries.push_back(Boundary(&*i, j));
+               for(; j<nsn; ++j)
+                       boundaries.push_back(Boundary(&*i, j));
+       }
+
+       snap_targets = designer.get_layout().get_all<Object>();
+       for(ObjectArray::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+               snap_targets.erase(i->object);
+}
 
+void MoveTool::pointer_motion()
+{
        Vector offset = center+ground_pointer-origin;
        for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
        {
@@ -22,21 +36,14 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel)
                i->object->set_rotation(i->original_rotation);
        }
 
-       const set<Track *> &ltracks = designer.get_layout().get_all<Track>();
        float limit = max(designer.get_layout().get_catalogue().get_gauge(),
                designer.get_camera_controller().get_view_scale()/100.0f);
        MObject *snapped = 0;
-       for(set<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
+       for(list<Boundary>::iterator i=boundaries.begin(); (!snapped && i!=boundaries.end()); ++i)
        {
-               bool ok = true;
-               for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && ok); ++j)
-                       ok = (j->object!=*i);
-               if(!ok)
-                       continue;
-
-               for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && !snapped); ++j)
-                       if(j->object->snap_to(**i, limit))
-                               snapped = &*j;
+               for(set<Object *>::const_iterator j=snap_targets.begin(); (!snapped && j!=snap_targets.end()); ++j)
+                       if((*i)->snap_to(**j, limit))
+                               snapped = i->object;
        }
 
        if(snapped)
@@ -54,3 +61,9 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel)
                }
        }
 }
+
+
+MoveTool::Boundary::Boundary(MObject *o, unsigned i):
+       object(o),
+       index(i)
+{ }