3 #include <msp/strings/format.h>
4 #include "libr2c2/tracktype.h"
6 #include "manipulator.h"
13 Manipulator::Manipulator(Designer &d, Input::Mouse &m, const set<Object *> &objs):
17 set<Object *> pending = objs;
18 while(!pending.empty())
20 for(set<Object *>::iterator i=pending.begin(); i!=pending.end(); )
22 if((*i)->get_parent() && pending.count((*i)->get_parent()))
26 objects.push_back(*i);
32 Geometry::BoundingBox<float, 3> bbox;
33 for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
34 bbox = bbox|i->object->get_bounding_box();
36 const Vector &minp = bbox.get_minimum_point();
37 const Vector &maxp = bbox.get_maximum_point();
39 center = (minp+maxp)/2.0f;
41 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
43 i->original_position = i->object->get_position()-center;
44 i->original_rotation = i->object->get_rotation();
48 Manipulator::~Manipulator()
52 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
54 i->object->set_position(center+i->original_position);
55 i->object->set_rotation(i->original_rotation);
60 void Manipulator::button_press(unsigned btn)
66 set<Object *> object_set;
67 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
68 object_set.insert(i->object);
69 for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
71 unsigned nls = i->object->get_n_link_slots();
72 for(unsigned j=0; j<nls; ++j)
73 if(Object *link = i->object->get_link(j))
74 if(!object_set.count(link))
75 i->object->break_link(j);
78 const set<Track *> <racks = designer.get_layout().get_all<Track>();
79 for(set<Track *>::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
82 for(vector<MObject>::iterator j=objects.begin(); (j!=objects.end() && ok); ++j)
86 for(vector<MObject>::iterator j=objects.begin(); j!=objects.end(); ++j)
87 j->object->link_to(**i);
96 Manipulator::MObject::MObject(Object *o):
98 original_position(object->get_position()),
99 original_rotation(object->get_rotation())