X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fmovetool.cpp;h=57f6216507e63c55a3d2157eaf519d6877b3f6ef;hb=5929b101ee38b5668b328e7b1eac4bf49c912412;hp=c7bae59cd9a8f010d324d908b5f45699bcfd8d8e;hpb=678982e7ddb22bb5fd44ce448d1c5cbf646b2573;p=r2c2.git diff --git a/source/designer/movetool.cpp b/source/designer/movetool.cpp index c7bae59..57f6216 100644 --- a/source/designer/movetool.cpp +++ b/source/designer/movetool.cpp @@ -6,15 +6,29 @@ using namespace std; using namespace Msp; using namespace R2C2; -MoveTool::MoveTool(Designer &d, Input::Mouse &m, const set &o): - Manipulator(d, m, o), +MoveTool::MoveTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, const set &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; jobject->get_link(j))) + boundaries.push_back(Boundary(&*i, j)); + for(; j(); + 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::iterator i=objects.begin(); i!=objects.end(); ++i) { @@ -22,21 +36,13 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel) i->object->set_rotation(i->original_rotation); } - const set <racks = designer.get_layout().get_all(); - float limit = max(designer.get_layout().get_catalogue().get_gauge(), - designer.get_camera_controller().get_view_scale()/100.0f); + float limit = designer.get_camera_controller().get_view_scale()/100.0f; MObject *snapped = 0; - for(set::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i) + for(list::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::const_iterator j=snap_targets.begin(); (!snapped && j!=snap_targets.end()); ++j) + if((*i)->snap_to(**j, (i->limit>0 ? max(i->limit, limit) : limit))) + snapped = i->object; } if(snapped) @@ -54,3 +60,13 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel) } } } + + +MoveTool::Boundary::Boundary(MObject *o, unsigned i): + object(o), + index(i), + limit(-1) +{ + if(Track *track = dynamic_cast(object->object)) + limit = track->get_type().get_appearance().get_gauge(); +}