]> git.tdb.fi Git - r2c2.git/blob - source/designer/movetool.cpp
Split the Manipulator class into several Tools
[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::Mouse &m, const set<Object *> &o):
10         Manipulator(d, m, o),
11         origin(ground_pointer)
12 { }
13
14 void MoveTool::axis_motion(unsigned axis, float value, float rel)
15 {
16         Manipulator::axis_motion(axis, value, rel);
17
18         Vector offset = center+ground_pointer-origin;
19         for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
20         {
21                 i->object->set_position(offset+i->original_position);
22                 i->object->set_rotation(i->original_rotation);
23         }
24
25         const set<Track *> &ltracks = designer.get_layout().get_all<Track>();
26         float limit = max(designer.get_layout().get_catalogue().get_gauge(),
27                 designer.get_camera_controller().get_view_scale()/100.0f);
28         MObject *snapped = 0;
29         for(set<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
30         {
31                 bool ok = true;
32                 for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && ok); ++j)
33                         ok = (j->object!=*i);
34                 if(!ok)
35                         continue;
36
37                 for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && !snapped); ++j)
38                         if(j->object->snap_to(**i, limit))
39                                 snapped = &*j;
40         }
41
42         if(snapped)
43         {
44                 Angle da = snapped->object->get_rotation()-snapped->original_rotation;
45                 Transform trans = Transform::rotation(da, Vector(0, 0, 1));
46                 const Vector &sp = snapped->object->get_position();
47                 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
48                 {
49                         if(&*i==snapped)
50                                 continue;
51
52                         i->object->set_position(sp+trans.transform(i->original_position-snapped->original_position));
53                         i->object->set_rotation(i->original_rotation+da);
54                 }
55         }
56 }