]> git.tdb.fi Git - r2c2.git/blob - source/designer/movetool.cpp
57f6216507e63c55a3d2157eaf519d6877b3f6ef
[r2c2.git] / source / designer / movetool.cpp
1 #include "libr2c2/layout.h"
2 #include "designer.h"
3 #include "movetool.h"
4
5 using namespace std;
6 using namespace Msp;
7 using namespace R2C2;
8
9 MoveTool::MoveTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, const set<Object *> &o):
10         Manipulator(d, k, m, o),
11         origin(ground_pointer)
12 {
13         for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
14         {
15                 unsigned nls = i->object->get_n_link_slots();
16                 unsigned nsn = i->object->get_n_snap_nodes();
17                 unsigned j;
18                 for(j=0; j<nls; ++j)
19                         if(!o.count(i->object->get_link(j)))
20                                 boundaries.push_back(Boundary(&*i, j));
21                 for(; j<nsn; ++j)
22                         boundaries.push_back(Boundary(&*i, j));
23         }
24
25         snap_targets = designer.get_layout().get_all<Object>();
26         for(ObjectArray::const_iterator i=objects.begin(); i!=objects.end(); ++i)
27                 snap_targets.erase(i->object);
28 }
29
30 void MoveTool::pointer_motion()
31 {
32         Vector offset = center+ground_pointer-origin;
33         for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
34         {
35                 i->object->set_position(offset+i->original_position);
36                 i->object->set_rotation(i->original_rotation);
37         }
38
39         float limit = designer.get_camera_controller().get_view_scale()/100.0f;
40         MObject *snapped = 0;
41         for(list<Boundary>::iterator i=boundaries.begin(); (!snapped && i!=boundaries.end()); ++i)
42         {
43                 for(set<Object *>::const_iterator j=snap_targets.begin(); (!snapped && j!=snap_targets.end()); ++j)
44                         if((*i)->snap_to(**j, (i->limit>0 ? max(i->limit, limit) : limit)))
45                                 snapped = i->object;
46         }
47
48         if(snapped)
49         {
50                 Angle da = snapped->object->get_rotation()-snapped->original_rotation;
51                 Transform trans = Transform::rotation(da, Vector(0, 0, 1));
52                 const Vector &sp = snapped->object->get_position();
53                 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
54                 {
55                         if(&*i==snapped)
56                                 continue;
57
58                         i->object->set_position(sp+trans.transform(i->original_position-snapped->original_position));
59                         i->object->set_rotation(i->original_rotation+da);
60                 }
61         }
62 }
63
64
65 MoveTool::Boundary::Boundary(MObject *o, unsigned i):
66         object(o),
67         index(i),
68         limit(-1)
69 {
70         if(Track *track = dynamic_cast<Track *>(object->object))
71                 limit = track->get_type().get_appearance().get_gauge();
72 }