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)
{
i->object->set_rotation(i->original_rotation);
}
- const set<Track *> <racks = 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);
+ float limit = 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, (i->limit>0 ? max(i->limit, limit) : limit)))
+ snapped = i->object;
}
if(snapped)
}
}
}
+
+
+MoveTool::Boundary::Boundary(MObject *o, unsigned i):
+ object(o),
+ index(i),
+ limit(-1)
+{
+ if(Track *track = dynamic_cast<Track *>(object->object))
+ limit = track->get_type().get_gauge();
+}